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 之间有不同的显示名称吗