iPhone和iPad与资产库之间的不同行为

时间:2011-08-26 16:08:39

标签: iphone ios ipad alassetslibrary

我正在使用应用中的资产库来枚举设备的照片事件。

我在iPad上测试代码时效果很好。照片事件被枚举,我可以完美地处理它们。当我在我的iPhone上尝试相同的代码时,没有任何反应(我也在这个设备上有照片事件)。看起来好像甚至没有调用枚举代码(即控制台中没有日志,参见代码)。

以下是代码:

- (void)loadEvents {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library enumerateGroupsWithTypes:ALAssetsGroupEvent
                           usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
                               if (group) {
                                   [photosEventsArray addObject:group];
                                   NSLog(@"Adding group");
                               } else {
                                   NSLog(@"End of the enumeration");
                               }
                           }
                         failureBlock: ^(NSError *error) {
                     NSLog(@"Failure while enumerating assets: %@", error);
                         }];
    [library release];

    NSLog(@"Found %d events", photosEventsFound);

    [self performSelectorOnMainThread:@selector(stopSpinner) withObject:nil waitUntilDone:YES];
    [pool drain];
}

我的部署目标是iOS 4.1。

知道这里出了什么问题吗?

1 个答案:

答案 0 :(得分:1)

经过更多调查后,似乎在iOS 4.3.5上,从主线程中调用了enumerateGroupsWithTypes方法。

我以这种方式修补了我的代码(从iPhone和iPod Touch设置为NO,从iPad设置为YES):

if (scanAssetsInBackground) {
    [self performSelectorInBackground:@selector(loadEvents) withObject:nil];
} else {
    [self performSelectorOnMainThread:@selector(loadEvents) withObject:nil waitUntilDone:YES];
}

适用于该补丁。

在Apple文档中没有太多关于此信息的信息,并且无法知道哪种方式(后台或主线程)是扫描资产库的正确方法。