,我有以下的代碼,它使用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。
你爲什麼認爲枚舉是異步發生的?我沒有在該方法的文檔中看到任何跡象。 – 2012-02-13 21:51:06
@kevin ballard - 它在文檔中說「這種方法是異步的」。 – 2012-02-13 22:06:38
呵呵,我們必須看看不同版本的文檔。你是對的,[當前文檔](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