,我有以下的代码,它使用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