Дело в том, что код в блоке называется асинхронно (поэтому блоки могут быть полезны, даже если это не единственное их типичное использование).
Вы можете подуматьэто как еще один способ сделать то, что обычно делается с делегатом, а именно асинхронно сообщается, когда данные доступны.
В случае вашего кода ALAssetsLibrary сделает запрос получить и декодировать метаданные EXIF запрашиваемого URL ресурса, , но код продолжится (после блока, без выполнения блока сразу) , переходя к следующим строкам (в вашемв случае [library release]
).
Позже , когда ALAssetsLibrary наконец-то получит информацию об активе и ALAsset, который вы запрашивали, будет, наконец, активировать код, заданный вами вblock (совсем как при использовании делегатов, а методы делегатов вызываются позже, когда доступны данные) .
Это объясняет, почему код в tЭтот «блок» будет выполняться асинхронно, а затем может быть выполнен до или после [library release]
, и к тому времени, когда вы попадете на строку [library release]
(или любой код, который вы вставите после вызова assetForURL
), кодв блоке, вероятно, не будет времени для выполнения.
Решение состоит в том, чтобы не использовать performSelector
, а лучше поместить код, который делает все необходимое для обновления вашего интерфейса или обработки данных EXIF в самом блоке.
Например, вы можете либо напрямую указать здесь код для обновления вашего интерфейса (например, [self.tableView reloadData]
, если вы отображаете данные EXIF в виде таблицы), либо запустить NSNotification для информирования остальной части вашего кода о том, чтоновые данные EXIF были добавлены с помощью addEntriesFromDictionary
и должны отображаться и т. д.)