保存照片的数组始终返回为空

时间:2012-05-13 08:08:54

标签: objective-c photos

我正在尝试从保存的相册中创建符合特定条件的所有图像的数组。这是一个简化的代码。我将照片添加到myImages阵列,并通过“添加图像”日志确认记录了正确的图像。但是,函数返回的数组始终为空。 Objective-C相当新,所以任何建议都会有所帮助。

NSMutableArray * myImages = [NSMutableArray array];

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

// Enumerate just the photos by using ALAssetsGroupSavedPhotos.
[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) {

    // Within the group enumeration block, filter to enumerate just photos.
    [group setAssetsFilter:[ALAssetsFilter allPhotos]];

    [group enumerateAssetsUsingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *innerStop) {

                             // The end of the enumeration is signaled by asset == nil.
                             if (alAsset) {
                                 ALAssetRepresentation *representation = [alAsset defaultRepresentation];
                                 UIImage *latestPhoto = [UIImage imageWithCGImage:[representation fullResolutionImage]];

                                     NSLog(@"Added Image");
                                     [myImages addObject:latestPhoto];
                             }
                         }];
                    }
                     failureBlock: ^(NSError *error) {
                         // Typically you should handle an error more gracefully than this.
                         NSLog(@"No groups");
                     }];

return myImages;

2 个答案:

答案 0 :(得分:0)

第一件事。你真的回来了imagesTakenOnDate吗?在你的代码中看不到对这个ivar的任何引用。我会说你在代码中放了一些断点。在gdb调试器控制台中,您可以键入:

po myImages

比调试器打印出阵列的内容。希望有所帮助

答案 1 :(得分:0)

什么是imagesTakenOnDate?那应该是myImages吗?如果是这样,则不能以这种方式返回它,因为块代码将在方法返回后执行。该方法是异步的。而不是“返回”,您有2个选项可以访问函数外的修改后的数组:

选项1:使您的方法将完成块作为参数,然后在enumerateGroupsWithTypes块内调用完成块,并将完成块传递给该数组。例如:

typedef void (^CompletionBlock)(id, NSError*);
-(void)myMethodWithCompletionBlock:(CompletionBlock)completionBlock;

然后当你完成成功通话时:

completionBlock(myImages, nil);

并在failureBlock调用中:

completionBlock(nil, error);

选项2:使数组成为保留在父对象上的ivar,而不是局部变量,然后将其声明为__block变量,以便可以在块中修改它。