【问题标题】:Access a single image with ALAssetsLibrary使用 ALAssetsLibrary 访问单个图像
【发布时间】:2011-09-14 06:32:15
【问题描述】:

请允许我先说这是我第一次使用 ALAssetsLibrary。我需要访问用户保存的照片库中的最新照片。似乎要做到这一点,我必须创建一个 ALAssetsLibrary 实例并在选择最后一个图像之前遍历用户库中的每个项目。这总是最坏的情况。有没有更快/更好的方法来解决这个问题?

【问题讨论】:

    标签: iphone objective-c photo alasset alassetslibrary


    【解决方案1】:

    您不必枚举用户图库中的所有照片。 ALAssetsGroup 类有一个方法- (void)enumerateAssetsAtIndexes:(NSIndexSet *)indexSet options:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock,您可以使用它来指示要枚举的资产。

    在您的情况下,它只是最后一个,因此将 indexSet 设置为 [NSIndexSet indexSetWithIndexesInRange:NSMakeRange([group numberOfAssets]-1, [group numberOfAssets]) 其中 group 是您的 ALAssetsGroup。

    正如@mithuntnt 提到的,您可以使用[[assetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) 获取照片库的 ALAssetsGroup

    【讨论】:

    • 谢谢,你真棒!这正是我想要的。
    • 如果您使用它,上述答案中的小错误。 NSMakeRange([group numberOfAssets]-1, [group numberOfAssets]) 应该是 NSMakeRange([group numberOfAssets]-1, 1) (nsmakerange 的第二个参数是计数,而不是结束索引)。或者,[NSIndexSet indexSetWithIndex:[group numberOfAssets]-1] 效率稍高。
    【解决方案2】:

    这个呢:

    [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
        if (result) {
           *stop = YES;
           //...
        }
    }];
    

    【讨论】:

      【解决方案3】:

      http://developer.apple.com/library/ios/#documentation/AssetsLibrary/Reference/ALAssetsLibrary_Class/Reference/Reference.html

      只有一种枚举方法。所以这是唯一的方法。

      我需要最后导入的照片。你可以有一些类似的过滤器。

      [[assetsLibrary] enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
          if( group )
          {
              NSString * groupName = [group valueForProperty:ALAssetsGroupPropertyName];
      
              if( [@"Last Import" isEqualToString:groupName] )
              {
                  *stop = true;
      

      ...

      【讨论】:

        【解决方案4】:

        如果您要枚举已设置过滤器的ALAssetGroup,则接受的答案似乎不起作用(因为[group numberOfAssets] 返回总资产,而不是过滤后的总资产)。

        我用过这个:

        typedef void(^SMKMostRecentPhotoCompletionBlock)(ALAsset *asset);
        
        - (void)mostRecentPhotoWithCompletionBlock:(SMKMostRecentPhotoCompletionBlock)completionBlock
        {
            ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
            [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
        
            __block ALAsset *mostRecentPhoto = nil;
        
            if (group)
            {
                [group setAssetsFilter:[ALAssetsFilter allPhotos]];
                [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
        
                    if (result != NULL)
                    {
                        mostRecentPhoto = result;
                        *stop = YES;
                    }
        
                }];
            }
        
            if (completionBlock)
            {
                completionBlock(mostRecentPhoto);
            }
        
        } failureBlock:^(NSError *error) {
        
            if (completionBlock)
            {
                completionBlock(nil);
            }
        
        }];
        

        }

        在您的 completionBlock 中,确保检查返回的 ALAsset != nil。

        【讨论】:

          猜你喜欢
          • 2012-02-04
          • 1970-01-01
          • 2014-04-27
          • 2013-10-18
          • 2015-01-05
          • 2015-11-12
          • 2016-02-03
          • 1970-01-01
          • 2016-10-31
          相关资源
          最近更新 更多