2011-05-23 37 views
0

我正在將所有圖像下載操作添加到Nsoperationqueue中。但有時候指標會永遠顯示。在這裏,我粘貼了一些我的代碼。有什麼辦法可以停止指標。這裏我正在檢查「operationcount」。如果它將變爲1意味着它的最後一個操作,所以我正在停止指標,但有時不工作的任何幫助將不勝感激。異步下載中的停止指示器

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
//filename = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:self.iconImage]; 
myobject.iconImage = [[UIImage alloc] initWithContentsOfFile:self.filename]; 
myobject.isImageLoaded = YES; 

[self willChangeValueForKey:@"isFinished"]; 
[self willChangeValueForKey:@"isExecuting"]; 
finished = YES; 
executing = NO; 
[self didChangeValueForKey:@"isExecuting"]; 
[self didChangeValueForKey:@"isFinished"]; 


NSLog(@"finsh"); 

AboutUSAppDelegate *appdel=(AboutUSAppDelegate*)[UIApplication sharedApplication].delegate; 
NSLog(@"%d",[appdel.queue operationCount]); 
if ([appdel.queue operationCount]==1) { 
    //code to stop indicator 
    //Using main thread 
} 

在這裏我已經添加了Nslog的操作計數,但有時它打印最後的值2兩次。其他值只有1次。

回答

0

您需要確保所有UI調用都是在主操作線程上進行的。因此,顯示活動指示器,使其旋轉,停止並隱藏它們都需要在主線程上完成。

合理的方式來實現,這是暴露在你的視圖控制器的方法來做到這一點,從您的操作裏面的代碼調用它們的主: -

查找

performSelectorOnMainThread:<(SEL)aSelector> withObject:<(id)arg> waitUntilDone:<(BOOL)wait> 
+0

感謝您的回答。我已經做到了,只是看到我的內部我的情況,如果我已經提到「使用主線程」 – Iducool 2011-05-23 11:02:04

+0

你也應該移動檢查計數<= 1到NSOperation以外的地方。我通常有委託方法或塊來通知操作已完成。無論如何,你執行的這些操作正在多個線程上並行處理,從而導致競爭狀況。 – TheBlack 2011-05-23 11:11:47

+0

count <= 1也不起作用,因爲有時nslog中的最後一個值僅顯示 - 2.您說的正確的是線程正在導致競爭狀態。有什麼方法或委託方法可以在操作完成時通知? – Iducool 2011-05-23 11:18:07

0

答案很簡單,你不能在委託方法實現中檢查操作隊列。當只有一個操作隊列完成時,這個方法被調用,它不會被你的隊列中的任何其他方法調用。

檢查您初始化它們的隊列。

+0

因爲所有操作都是關於下載圖像,所以每次操作都會調用此方法一次。如果我錯了,請解釋更多 – Iducool 2011-05-23 12:40:52