Iphone:无法使用库显示照片
我目前正在将ipa发送给朋友进行测试。有趣的是,我的一个测试人员可以查看她手机上存储的照片,她的手机使用iPhone4运行iOS5 另外两名测试人员:一名是iPhone4iOS4.3.3,另一名是iPhone3GS iOS5.0.1,他们都看不到手机上存储的照片 以下是我使用的代码:Iphone:无法使用库显示照片,iphone,asynchronous,photos,alassetslibrary,Iphone,Asynchronous,Photos,Alassetslibrary,我目前正在将ipa发送给朋友进行测试。有趣的是,我的一个测试人员可以查看她手机上存储的照片,她的手机使用iPhone4运行iOS5 另外两名测试人员:一名是iPhone4iOS4.3.3,另一名是iPhone3GS iOS5.0.1,他们都看不到手机上存储的照片 以下是我使用的代码: ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; void (^assetEnumerator)(ALAsset *, NSUInteger,
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\u async放在枚举组块中
有人知道怎么回事吗
此外,iOS 4.3.3的测试人员可以在“常规->设置”下启用位置服务后显示其照片。我们为什么要启用它?我们是否可以在代码中启用它,因为它会对使用我们的应用程序的用户造成相当大的干扰。是的,这非常令人沮丧,但事实就是如此,而且您不能在代码中启用位置服务,这是一件好事。是的,这非常令人沮丧,但事实就是如此,但是,您不能在代码中启用位置服务,这是一件好事。我会通过[[copy]autorelease]将第一个块^assetGroupEnumerator移动到堆中。为什么?因为此块将由runloop自动释放,如果需要枚举许多资产。我将通过[[copy]autorelease]将第一个块^assetGroupEnumerator移动到堆中。为什么?由于此块将由runloop自动释放,因此如果有许多资产需要通过枚举。同样在iOS 5.x上,只要需要使用收集的资产,就必须保留AlassetLibrary实例。当您在调用[library enumerateGroupsWithTypes:…]之后释放代码中的AlassetLibrary实例时,所有收集的资产都将无效 另请参见图书馆文档-概述: …从库实例返回的对象的生存期与库实例的生存期相关联
此外,在iOS 5.x上,只要需要使用收集的资产,就必须保留库实例。当您在调用[library enumerateGroupsWithTypes:…]之后释放代码中的AlassetLibrary实例时,所有收集的资产都将无效 另请参见图书馆文档-概述: …从库实例返回的对象的生存期与库实例的生存期相关联
还有一件事:不要使用[self-loadAssetToScrollView:assets];在块内部,但在块之前获得self的弱引用,如下所示:
__block YourExampleClassInstance *weakSelf = self;
并在块内进一步使用此weakSelf实例:
[weakSelf loadAssetToScrollView:assets];
void (^assetGroupEnumerator)… = ^(ALAssetsGroup *group, BOOL *stop) {
…
};
为什么??避免保留循环。还有一件事:不要使用[self-loadAssetToScrollView:assets];在块内部,但在块之前获得self的弱引用,如下所示:
__block YourExampleClassInstance *weakSelf = self;
并在块内进一步使用此weakSelf实例:
[weakSelf loadAssetToScrollView:assets];
void (^assetGroupEnumerator)… = ^(ALAssetsGroup *group, BOOL *stop) {
…
};
为什么??避免保留循环。你是说iOS 4上的“弱”或“不安全”而不是“块”上的“未维护”吗?你能给我一个原因吗?对不起,我是objective-c的新手,我还有很多东西要学@马克·亚当斯你好,马克,目前我还没有使用ARC。但是对于ARCed项目,你绝对是对的。@Simon嗨,Simon,我建议你看一下苹果公司的WWDC2011 308期,尤其是在38:20的时间点,Block_copy不做什么?滑动我们将很好地解释关于保留周期的问题。你的意思不是说在iOS 4上“弱”或“不安全”而不是“块”无法保留吗?你能给我一个原因吗?对不起,我是objective-c的新手,我还有很多东西要学@马克·亚当斯你好,马克,目前我还没有使用ARC。但是对于ARCed项目,你绝对是对的。@Simon嗨,Simon,我建议你看一下苹果公司的WWDC2011 308期,尤其是在38:20的时间点,Block_copy不做什么?滑动我们将很好地解释关于保留周期的问题。很抱歉,我没有及时回复,我不太明白。你的意思是,如果我试图存储ALASSET供以后使用,这些ALASSET将为null或类似的东西。在我的代码中,我只对ALAssets对象的url感兴趣,所以我只保留url而不是对象本身。所以我仍然需要关心对象的生命周期。这些收集的资产实例将获得零值或类似值,是的。如果您只对资产的url感兴趣,那么只收集这些url。稍后您将在[assetForURL:resultBlock:failureBlock:]方法中使用它们再次检索资产对象。整个过程看起来像是带有托管对象上下文MOC的核心数据,而库实例看起来像这个MOC实例。因此,在核心数据中,当您关闭此MOC实例时,您无法访问其背后的数据。很抱歉,延迟回复,我不太理解。你的意思是,如果我试图存储ALASSET供以后使用,这些ALASSET将为null或类似的东西。在我的代码中,我只对
设置对象,因此我只保留url,而不保留对象本身。所以我仍然需要关心对象的生命周期。这些收集的资产实例将获得零值或类似值,是的。如果您只对资产的url感兴趣,那么只收集这些url。稍后您将在[assetForURL:resultBlock:failureBlock:]方法中使用它们再次检索资产对象。整个过程看起来像是带有托管对象上下文MOC的核心数据,而库实例看起来像这个MOC实例。因此,在核心数据中,当您关闭此MOC实例时,您无法访问其背后的数据。