2011-12-15 51 views
1

显示照片我目前正在将ipa发送给朋友进行测试。有趣的是,我的一个测试人员能够查看存储在她的手机上的照片,这张照片是使用iPhone 4运行IOS 5的。Iphone:无法使用AlAssetsLibrary

另外两个测试人员:一个有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下启用位置服务后显示他的照片。为什么我们必须启用它?我们是否可以在代码上启用它,因为使用我们应用程序的用户会感到非常不安。

回答

1

是的,这是令人难以置信的令人沮丧的,但它是这样,并且你不能在代码中启用位置服务(虽然这是一件好事)。

0

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

3

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

又见ALAssetsLibrary DOC - 概述:

“...对象从库实例找回寿命是绑库实例的一生......”

+0

对不起,迟到的回复,我不太明白。你的意思是,如果我试图存储AlAssets以备后用,这些AlAssets将为空或类似的东西。在我的代码中,我只对ALAssets对象的URL感兴趣,所以我只保留url而不是对象本身。所以我仍然需要关心物体的寿命。 – LittleFunny 2011-12-16 10:10:57

+1

这些收集的资产实例将得到未删除的值(或类似的东西),是的。如果您只对资产的网址感兴趣,那么只收集这些网址。稍后您应在[assetForURL:resultBlock:failureBlock:]方法中使用它们以再次检索资产对象。整个事情看起来像带有托管对象上下文(MOC)的核心数据和ALAssetsLibrary实例看起来像这个MOC实例。因此,在核心数据中,当你“解散”这个MOC实例时,你不能访问它后面的数据。 – Lorion 2011-12-16 13:15:19

0

一更多的事情:不要使用[self loadAssetToScrollView:assets];区块内,但这样的块之前获得自我的弱引用:

__block YourExampleClassInstance *weakSelf = self; 

,并进一步使用块这里面weakSelf实例:

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

为什么?为了避免保留周期。

相关问题