Я пытаюсь создать миниатюры (288x288) выбранных фотографий из библиотеки фотографий iPad.У меня есть массив объектов ALAsset, представленных в UITableView, и когда я выбираю строку, отображается увеличенный предварительный просмотр (288x288) этого изображения.Чтобы предотвратить блокировку основного потока, я пытаюсь создать миниатюру в фоновом потоке, а также кэшировать копию миниатюры в файловую систему.
В контроллере представления, когда выбрана строка представления таблицы,Я вызываю loadPreviewImage в фоновом режиме:
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// get the upload object from an array that contains a ALAsset object
upload = [uploads objectAtIndex:[indexPath row]];
[self performSelectorInBackground:@selector(loadPreviewImage:)
withObject:upload];
}
Я передаю пользовательский объект загрузки, который содержит свойство asseturl:
- (void)loadPreviewImage:(MyUploadClass*)upload
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *preview = [upload previewImage];
[self performSelectorOnMainThread:@selector(setPreviewImage:)
withObject:preview
waitUntilDone:YES];
[pool release];
}
Это вызывается в главном потоке для отображения эскиза после его загрузки:
- (void)setPreviewImage:(UIImage*)image
{
self.imageViewPreview.image = image;
[self layoutSubviews];
}
Это метод MyUploadClass:
- (UIImage *)previewImage
{
__block UIImage *previewImage = [[UIImage imageWithContentsOfFile:
[self uploadPreviewFilePath]] retain];
if (previewImage == nil && asseturl)
{
ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];
[library assetForURL:self.asseturl resultBlock:^(ALAsset *asset)
{
ALAssetRepresentation *rep = [asset defaultRepresentation];
previewImage = [UIImage imageWithCGImage: [rep fullScreenImage]];
previewImage = [[previewImage resizedImageWithContentMode:UIViewContentModeScaleAspectFit
bounds:CGSizeMake(288, 288)
interpolationQuality:kCGInterpolationHigh] retain];
NSData *previewData = UIImageJPEGRepresentation(previewImage, 1.0);
[previewData writeToFile:[self uploadPreviewFilePath] atomically:YES];
}
failureBlock:^(NSError *error){ }];
[library release];
}
return [previewImage autorelease];
}
Проблема в том, что я всегда получаю nil previewImage в первый раз, и только после того, как миниатюра кэшируется, я получаю объект изображения.Что я делаю неправильно?Есть ли лучший подход к этой проблеме?