Я пытаюсь прочитать данные EXIF из изображений в рулоне камеры iOS, используя фантастический код здесь:
http://blog.codecropper.com/2011/05/getting-metadata-from-images-on-ios/
К сожалению, при первой попытке чтения данных возвращается nil... но все последующие попытки работают нормально.
Автор блога знает об этом и излагает решение, но я его совершенно не понимаю! Я новичок в "блоках" и просто не понимаю, хотя и читал: http://Thirdcog.eu/pwcblocks/
Кто-нибудь может мне перевести?
Это код, используемый для чтения данных:
NSMutableDictionary *imageMetadata = nil;
NSURL *assetURL = [info objectForKey:UIImagePickerControllerReferenceURL];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:assetURL
resultBlock:^(ALAsset *asset) {
NSDictionary *metadata = asset.defaultRepresentation.metadata;
imageMetadata = [[NSMutableDictionary alloc] initWithDictionary:metadata];
[self addEntriesFromDictionary:metadata];
}
failureBlock:^(NSError *error) {
}];
[library autorelease];
который удобно помещается в метод инициализации и вызывается так:
NSMutableDictionary *metadata = [[NSMutableDictionary alloc] initWithInfoFromImagePicker:info];
Авторское описание проблемы первой попытки:
Одно предостережение при использовании этого: поскольку он использует блоки, нет гарантии, что ваш словарь imageMetadata будет заполнен при выполнении этого кода. В некоторых тестах, которые я проводил, код иногда запускался внутри блока даже до того, как был выполнен [авторелиз библиотеки]. Но при первом запуске код внутри блока будет выполняться только в другом цикле основного цикла приложения. Итак, если вам нужно использовать эту информацию прямо сейчас, лучше запланировать метод в очереди выполнения на потом с помощью:
[self performSelectorOnMainThread:SELECTOR withObject:SOME_OBJECT waitUntilDone:NO];
.. и именно на этой линии я застрял! Я не знаю, что с этим делать?
Любая помощь очень ценится!