Является ли ALAssetsLibrary потокобезопасным (тупиковая ситуация возникает при использовании нескольких потоков)
Сейчас я работаю над крошечным проектом, который предназначен для загрузки ВСЕХ фотографий галереи в мое приложение, чтобы показать какой-то необычный эффект. К сожалению, эти эскизы по умолчанию, предоставленные системой, не могут удовлетворить мои требования. Поэтому я пытаюсь создать свои собственные миниатюры, используя "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);
}] ;
});
}
}
В консоли печатается только журнал "Запрос...", метод "getFullScreenImage" заблокирован, никаких выходных данных нет.
Я попробовал следующие методы, чтобы обойти эту проблему:
- Не делится активами LibraryInstance (не работает)
- Не отправляйте dispatch_async при перечислении URL-адресов в "processURL". (Работал, но я не хочу использовать поток подписи для обработки всех URL)
- Не используя глобальную очередь, используя основную очередь (Работало, но все эти "fullScreenImage" работали в потоке пользовательского интерфейса, что делало пользовательский интерфейс невосприимчивым)
- Использование личной очереди, созданной с помощью "dispatch_queue_create". (Не работает)
Итак, безопасен ли поток ALAssetsLibrary? Я думаю, это не так... Или есть ли лучший способ, которым я могу использовать для:
- Загрузите fullScreenImage в фоновом режиме
- Многопоточность
Спасибо!