Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone:无法使用库显示照片_Iphone_Asynchronous_Photos_Alassetslibrary - Fatal编程技术网

Iphone:无法使用库显示照片

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,

我目前正在将ipa发送给朋友进行测试。有趣的是,我的一个测试人员可以查看她手机上存储的照片,她的手机使用iPhone4运行iOS5

另外两名测试人员:一名是iPhone4iOS4.3.3,另一名是iPhone3GS iOS5.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\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实例时,您无法访问其背后的数据。