2012-02-13 49 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