Iphone: невозможно показать фотографии с помощью AlAssetsLibrary - PullRequest
1 голос
/ 15 декабря 2011

Я сейчас отправляю ipa друзьям для тестирования. Самое смешное, что один из моих тестировщиков мог просматривать ее фотографии, хранящиеся на ее телефоне, работающем под управлением IOS 5, с помощью iPhone 4.

Еще 2 тестера: у одного есть iPhone 4 (IOS 4.3.3) и iPhone 3GS (IOS 5.0.1), они не могут видеть фотографии, хранящиеся на их телефоне.

Вот код, который я использовал:

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
    if(result != NULL) {
        //NSLog(@"See Asset: %@", @"ggg");
        [assets addObject:result];

    }
};

NSLog(@"location = %i      length = %i ", range->location, range->length );

void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop) {
    if(group != nil) {

        NSRange  *datarange = malloc(sizeof(NSRange));

        range->total = [group numberOfAssets];
        datarange->location = [group numberOfAssets] - range->location - range->length;
        datarange->length = range->length;
        NSLog(@" total = %i", range->total);

        int location = [group numberOfAssets] - range->location - range->length;

        if (location < 0)
        {
            datarange->location = 0;
            datarange->length = [group numberOfAssets] - range->location;
        }

        NSIndexSet *indexset = [ [NSIndexSet alloc] initWithIndexesInRange:*datarange];

        [group enumerateAssetsAtIndexes:indexset options:NULL
                             usingBlock:assetEnumerator];

        [indexset release];
        free(datarange);

        [self loadAssetToScrollView:assets]; 

    }

};    

    [assets release];

    assets = [[NSMutableArray alloc] init];


    [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos
                           usingBlock:assetGroupEnumerator
                         failureBlock: ^(NSError *error) {
                             NSLog(@"Failure");
                         }];

    [library release];

Я видел, как кто-то говорил об асинхронных вещах в других потоках, но не знаю, так ли это. Он говорит, что поместите dispatch_async в блок перечисления группы.

Кто-нибудь знает, что не так.

Кроме того, один из тестеров с iOS 4.3.3 может показывать свои фотографии после включения служб определения местоположения в General-> Setting. Почему мы должны включить это? Можем ли мы включить его в коде, так как это будет очень беспокоить пользователя, который использует наше приложение.

Ответы [ 4 ]

3 голосов
/ 16 декабря 2011

Также в iOS 5.x вы должны сохранить свой экземпляр ALAssetsLibrary, пока вам нужно работать с собранными активами.Когда вы отпускаете свой экземпляр ALAssetsLibrary, как в своем коде, сразу после вызова [library enumerateGroupsWithTypes:…], все собранные ресурсы будут недействительными.

См. Также ALAssetsLibrary doc - обзор:

"... Время жизни объектов, которые вы получаете из экземпляра библиотеки, связано с временем жизни экземпляра библиотеки.

1 голос
/ 15 декабря 2011

Да, это невероятно расстраивает, но это так, и вы не можете включить службы определения местоположения в коде (хотя это хорошо).

0 голосов
/ 16 декабря 2011

Еще одна вещь: не используйте [self loadAssetToScrollView: assets]; внутри блока, но получить слабую ссылку на себя перед блоком, как это:

__block YourExampleClassInstance *weakSelf = self;

и далее использовать этот экземпляр weakSelf внутри блока:

[weakSelf loadAssetToScrollView:assets];
void (^assetGroupEnumerator)… = ^(ALAssetsGroup *group, BOOL *stop) {
…
};

Почему? Чтобы избежать сохранения циклов.

0 голосов
/ 16 декабря 2011

Я бы переместил первый блок ^assetGroupEnumerator в кучу на [[<#block#> copy] autorelease]. Зачем? Поскольку этот блок будет автоматически освобожден runloop, если нужно перечислить много ресурсов через.

...