繁体   English   中英

Iphone:无法使用AlAssetsLibrary显示照片

[英]Iphone: unable to show photos using AlAssetsLibrary

我目前正在向朋友发送ipa进行测试。 有趣的是,我的一位测试员能够查看存储在手机上的照片,该手机使用iPhone 4运行IOS 5。

另外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下启用位置服务后显示他的照片。 为什么我们必须启用它? 我们可以在代码上启用它,因为它会对使用我们的应用程序的用户造成很大的干扰。

同样在iOS 5.x上,只要您需要使用收集的资源,就必须保留ALAssetsLibrary实例。 当您在调用[library enumerateGroupsWithTypes:…]ALAssetsLibrary释放ALAssetsLibrary实例时,所有收集的资源都将无效。

另请参阅ALAssetsLibrary doc - overview:

“...从库实例返回的对象的生命周期与库实例的生命周期相关联。...”

是的,令人难以置信的是令人沮丧,但事实就是如此,你无法在代码中启用位置服务(尽管这是一件好事)。

我会通过[[<#block#> copy] autorelease]将第一个块^assetGroupEnumerator移动到堆中。 为什么? 因为这个块将由runloop自动释放,如果有许多资产需要通过枚举。

还有一件事:不要使用[self loadAssetToScrollView:assets]; 在块内,但在块之前得到自我的弱引用,如下所示:

__block YourExampleClassInstance *weakSelf = self;

并进一步在块内使用此weakSelf实例:

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

为什么? 避免保留周期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM