我目前正在向朋友发送ipa进行测试。有趣的是,我的一位测试人员可以查看她使用iPhone 4运行IOS 5的手机上存储的照片。
另外两位测试人员:一位有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-&gt; Setting下启用位置服务后显示他的照片。为什么我们必须启用它?我们可以在代码上启用它,因为这对使用我们的应用程序的用户来说会非常令人不安。
答案 0 :(得分:3)
同样在iOS 5.x上,只要您需要处理收集的资产,就必须保留ALAssetsLibrary
个实例。当您在调用ALAssetsLibrary
后立即释放代码中的[library enumerateGroupsWithTypes:…]
实例时,所有收集的资产都将无效。
另请参阅ALAssetsLibrary
doc - overview:
“...您从库实例返回的对象的生命周期与库实例的生命周期相关联。...
答案 1 :(得分:1)
是的,令人难以置信的是令人沮丧,但事实就是如此,你无法在代码中启用位置服务(虽然这是一件好事)。
答案 2 :(得分:0)
我会通过^assetGroupEnumerator
将第一个块[[<#block#> copy] autorelease]
移动到堆中。为什么?因为这个块将由runloop自动释放,如果有许多资产需要通过枚举。
答案 3 :(得分:0)
还有一件事:不要使用[self loadAssetToScrollView:assets];在块内,但在块之前得到自我的弱引用,如下所示:
__block YourExampleClassInstance *weakSelf = self;
并在块中进一步使用此weakSelf实例:
[weakSelf loadAssetToScrollView:assets];
void (^assetGroupEnumerator)… = ^(ALAssetsGroup *group, BOOL *stop) {
…
};
为什么呢?避免保留周期。