Проблема с библиотеками активов iOS 4: NSMutableArray содержит данные в блоке, но пуст после блоков вызовов - PullRequest
0 голосов
/ 21 февраля 2011

Я пытаюсь включить пример из 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загружая их, основываясь на пути, по которому они существуют, но я бы предпочел использовать ресурсы, если смогу выяснить, почему они работают не так, как ожидалось

1 Ответ

1 голос
/ 10 апреля 2011

Что я сделал для этого, так это проверял, когда группа равна нулю, чтобы увидеть, когда она закончила перечислять, тогда вы можете проверить счет ...

if(group == nil) { 
    NSLog('Assets finished renumerating, %i found', [self.assets count]); 
} else { 
    [group enumerate...]; 
}

Кроме того, если вы используете активы в качестве свойства, используйте везде self.assets, чтобы оно обновлялось. Этот код теперь работает для меня:)

...