Я пытаюсь включить пример из http://www.icodeblog.com/asset-libraries-and-blocks-in-ios-4/ в мое собственное приложение.Это то, что у меня есть до сих пор:
@interface UserTabBarController : UIViewController <NSFetchedResultsControllerDelegate, UITabBarDelegate> {
NSMutableArray *assets;
}
-(void)usingAssets;
@end
@implementation UserTabBarController
-(void)usingAssets{
void (^assetEnumerator)(struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
if(result != NULL) {
NSLog(@"See Asset: %@", result);
[assets addObject:result];
NSLog(@"assets count: %i", assets.count);
}
else {
NSLog(@"AssetEnum: result nil or end of list");
}
};
void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) {
if(group != nil) {
[group enumerateAssetsUsingBlock:assetEnumerator];
}
else {
NSLog(@"GroupEnum: group nil or end of list");
}
NSLog(@"assets count in GroupEnum: %i", assets.count);
};
ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupAll
usingBlock:assetGroupEnumerator
failureBlock: ^(NSError *error) {
NSLog(@"Failure: %@", error.description);
}];
[library release];
}
Давайте (будем надеяться) согласимся, что каждый раз, когда я звоню с помощью Assets, я добавляю последнее содержимое фотоальбома в NSMutableArray* assets
.Я собираю все это вместе в ViewDidLoad моего ViewController:
- (void)viewDidLoad {
[super viewDidLoad];
assets = [[NSMutableArray alloc] init];
[self usingAssets];
for (ALAsset* a in self.assets){
NSLog(@"Item in asset");
}
NSLog(@"Asset count: %i", assets.count);
[self usingAssets];
NSLog(@"Asset count: %i", assets.count);
}
До сих пор, я думаю, я следовал примеру, показанному в ссылке выше.Проблема заключается в том, что в области действия UserTabBarController значение assets.count
остается равным 0, а в пределах области блока оно показывает увеличение количества и сохраняется между двумя вызовами (как я и ожидал).Что я также нахожу странным, так это то, что строки Asset count: 0 должны появляться намного позже в журнале, или, возможно, строки просмотра ресурсов (которые вызываются изнутри блока) должны происходить раньше:
2011-02-21 14: 22: 59.140 iPCS [7219: 207] Количество активов: 0
2011-02-21 14: 23: 08.539 iPCS [7219: 207] Количество активов: 0
2011-02-21 14: 14: 03.363 iPCS [7139: 207] См. Актив: ALAsset - Тип: Фото, URL: {"public.jpeg" = "Библиотека ресурсов: //asset/asset.JPG? Id = 1000000001 & ext =JPG ";}
2011-02-21 14: 14: 03.363 iPCS [7139: 207] количество активов: 1
2011-02-21 14: 14: 03.365 iPCS [7139: 207] См. Актив: ALAsset- Тип: Фото, URL: {"public.jpeg" = "assets-library: //asset/asset.JPG? Id = 1000000002 & ext = JPG";}
2011-02-21 14: 14: 03.366 iPCS [7139: 207] количество активов: 2
2011-02-21 14: 14: 03.367 iPCS [7139: 207] AssetEnum: result nilили конец списка
2011-02-21 14: 14: 03.367 iPCS [7139: 207] счетчик активов в GroupEnum: 2
2011-02-21 14: 14: 03.368 iPCS [7139: 207] GroupEnum:группа ноль или конец списка
2011-02-21 14: 14: 03.368 Количество активов iPCS [7139: 207] в GroupEnum: 2
2011-02-21 14: 14: 03.370 iPCS [7139: 207] См. Актив: ALAsset - Тип: Фото, URL: {"public.jpeg" = "assets-library: //asset/asset.JPG? Id = 1000000001 & ext = JPG";}
2011-02-21 14: 14: 03.371 iPCS [7139: 207] количество активов: 3
2011-02-21 14: 14: 03.373 iPCS [7139: 207] См. Актив: ALAsset- Тип: Фото, URL: {"public.jpeg" = "assets-library: //asset/asset.JPG? Id = 1000000002 & ext = JPG";}
2011-02-21 14: 14: 03.374 iPCS [7139: 207] количество активов: 4
2011-02-21 14: 14: 03.374 iPCS [7139: 207] AssetEnum: result nilили конец списка
2011-02-21 14: 14: 03.375 iPCS [7139: 207] счетчик активов в GroupEnum: 4
2011-02-21 14: 14: 03.375 iPCS [7139: 207] GroupEnum:группа ноль или конец списка
2011-02-21 14: 14: 03.376 Количество активов iPCS [7139: 207] в GroupEnum: 4
Что вы все говорите?
Редактировать:Запустил еще несколько тестов и вызвал usingAssets
, используя кнопку в представлении, и массив assets
был заполнен правильно!Это означает, что во время загрузки, во время viewDidLoad
, существует некое разъединение между объектом, видимым в блоке, и объектом, видимым в вызывающем экземпляре блока.У кого-нибудь есть какие-либо идеи относительно того, почему он демонстрирует такое поведение?
Редактировать 2: я уже больше недели играю с кодом, и я все еще не могу заставить активы NSArray точно отображать контент.Я определил, что это должно быть связано с порядком выполнения блоков.Когда я вызываю usingAssets
, сам метод завершается, но блоки не запускаются сразу.Итак, скажем, я привязываю метод к кнопке и сразу печатаю содержимое assets
, оно пустое (у меня в библиотеке 2 изображения).Я нажимаю кнопку еще раз, теперь содержимое показывает 2 пункта.Если я щелкну по нему в третий раз, появится 4загружая их, основываясь на пути, по которому они существуют, но я бы предпочел использовать ресурсы, если смогу выяснить, почему они работают не так, как ожидалось