1

我在应用程序上使用资产库来枚举设备的照片事件。

当我在 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。

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

4

1 回答 1

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

于 2011-08-31T15:46:48.740 回答