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

Posted

技术标签:

【中文标题】iPhone 和 iPad 之间的不同行为与资产库【英文标题】:Different behavior between iPhone and iPad with the Assets Library 【发布时间】:2011-08-26 16:08:38 【问题描述】:

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

当我在 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】:

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

【讨论】:

以上是关于iPhone 和 iPad 之间的不同行为与资产库的主要内容,如果未能解决你的问题,请参考以下文章

资产目录中的横向与纵向背景图像

如何在资产目录新图像集中删除所有 iPhone/iPad 视网膜/非视网膜图像

我可以让我的通用应用在 iPhone 和 iPad 之间有不同的显示名称吗

为不同的设备/分辨率使用不同的图像,例如如何使用波浪号 (~) 来区分 iPhone 和 iPad?

iPhone iPad 蓝牙传输

资产目录中设备特定图像集中的设备