1

我目前将 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 放在 enumerate group 块中。

有谁知道出了什么问题。

此外,iOS 4.3.3 的测试人员之一可以在 General->Setting 下启用定位服务后显示他的照片。为什么我们必须启用它?我们可以在代码上启用它吗,因为它会给使用我们应用程序的用户带来很大的困扰。

4

4 回答 4

3

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

另请参阅ALAssetsLibrary文档 - 概述:

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

于 2011-12-15T21:53:48.373 回答
1

是的,这非常令人沮丧,但事实就是如此,而且您无法在代码中启用定位服务(尽管这是一件好事)。

于 2011-12-15T11:12:07.950 回答
0

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

于 2011-12-15T21:48:36.103 回答
0

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

__block YourExampleClassInstance *weakSelf = self;

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

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

为什么?避免保留循环。

于 2011-12-15T22:00:15.493 回答