2012-02-13 53 views
1

,我有以下的代碼,它使用ALAssets庫來存儲用戶相冊陣列,使得它可以在像照片應用程序的表格填充它們:Aysynchronous方法,塊和GCD,無法理解

- (void) loadAlbums 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [[self activityIndicator] startAnimating]; 

    [[self library] enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) 
    { 
     if (group == nil) 
     { 
      [[self activityIndicator] stopAnimating]; 
      [[self tableView] reloadData]; 

      return; 
     } 

     [[self albums] addObject:group]; 
    } 
    failureBlock:^(NSError *error) 
    { 
     UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[NSString stringWithFormat:@"Album Error: %@", [error description]] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 
    }]; 

    [pool release]; 
} 

從我的最佳理解,enumerateGroupsWithTypes是一個異步方法,這意味着它運行在自己的線程。然而,block參數在主線程上運行。 隨着代碼最高,我的活動指標出現問題。當viewcontroller第一次運行時,activityindicator工作正常,但是如果我將viewcontroller從堆棧彈出(即按下後退按鈕)並重新加載它,活動指示器不會出現(儘管我使用isHidden等等。)。所以我有一些問題:

1)任何人都有任何洞察問題可能與活動指標?

2)除了使用[NSThread sleepWithDuration]NSTimer之外,什麼是最好的方式來模擬緩慢的加載時間,而無需創建一個照片相冊大量的圖片?

3)如果它需要一段時間來加載照片,我的應用程序的用戶界面是否會被阻止,或用戶是否仍然能夠與它進行交互?由於它在單獨的線程上運行,因此它看起來應該是這樣,但我並不確定。

更新:有關如何使用這個更好的想法或資源?我已經閱讀了Apple的線程編程和併發編程人員,並觀看了很多WWDC視頻,但我仍然無法理解如何處理這種絕對簡單的情況,我只是試圖不阻止用戶的UI。

+0

你爲什麼認爲枚舉是異步發生的?我沒有在該方法的文檔中看到任何跡象。 – 2012-02-13 21:51:06

+0

@kevin ballard - 它在文檔中說「這種方法是異步的」。 – 2012-02-13 22:06:38

+0

呵呵,我們必須看看不同版本的文檔。你是對的,[當前文檔](https://開發者。apple.com/library/ios/documentation/AssetsLibrary/Reference/ALAssetsLibrary_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40009722-CH1-SW2)確實這麼說。 – 2012-02-13 22:16:32

回答

3

從我最好的理解,enumerateGroupsWithTypes是一個異步方法,這意味着它運行在它自己的線程。

「異步」並不意味着「運行在它自己的線程上」。 iOS中有多種異步方式。最常見的一種是使用運行循環。這並不是說這種方法不會生成線程;它可能。但是沒有理由假設它,如果是這樣,那是一個私人實現細節。正如你所說,你的塊在主線程上運行,這是唯一真正關心你的地方。

從你描述的症狀來看,我懷疑它與這段代碼有什麼關係。這聽起來更像是你的視圖加載代碼中的一個錯誤。我會檢查例程loadView,viewDidLoad,initWithFrame:,awakeFromNib,viewWillAppear:viewDidAppear:。很有可能您在錯誤的位置創建進度指示器,或者無法將其插入到視圖層次結構中,或者將其從視圖層次結構中刪除。

關於模擬慢加載時間,我會推薦「大量圖片」的方法。你應該能夠以編程方式生成大量圖片(你甚至可以一遍又一遍地複製相同的圖片),所以這不應該太糟糕。有點煩人,如果它是你的個人設備,但這是發展的本質。

+0

+1只爲'「異步」並不意味着「在自己的線程上運行」。不是說你的答案的其他部分是不正確的,只是我總是看到這個'異步==不同的線程'邏輯。 – NJones 2012-02-14 20:09:51