我目前正在做一个小项目,该项目将所有画廊照片加载到我的应用程序中以显示一些奇特的效果。不幸的是,系统提供的这些默认缩略图不能满足我的要求。所以我尝试使用“fullScreenImage”创建自己的缩略图。为了加快这个过程,我使用后台操作加载 fullScreenImage。主要方法有:
- (void)getFullScreenImage:(NSURL *)url success:(void(^)(UIImage *))callback
{
NSLog(@"Requesting %@", url);
[assetsLibraryInstance assetForURL:url resultBlock:^(ALAsset *asset) {
callback(asset.defaultRepresentation.fullScreenImage);
}
failureBlock:nil];
}
- (void)processURLs:(NSArray *)urls
{
for (NSURL *url in urls) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) ^{
[self getFullScreenImage:url success:^(UIImage *img) {
NSLog(@"Got image %@", img);
}] ;
});
}
}
控制台中只打印“Requesting...”日志,“getFullScreenImage”方法被锁定,没有任何输出。
我尝试了以下方法来解决此问题:
- 不共享 assetsLibraryInstance(没用)
- 在“processURLs”中枚举 url 时不要 dispatch_async。(确实有效,但我不想使用信号线程来处理所有 URL)
- 不使用全局队列,使用主队列(确实工作,但所有这些“fullScreenImage”工作都在 UI 线程上进行,使 UI 无响应)
- 使用通过“dispatch_queue_create”创建的私有队列。(没用)
那么,ALAssetsLibrary 线程安全吗?我想这不是......或者,有没有更好的方法可以用来:
- 在后台加载 fullScreenImage
- 多线程
谢谢!