0

我正在尝试从已保存的相册中创建符合特定条件的所有图像的数组。这是它的简化代码。我将照片添加到 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;
4

2 回答 2

0

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

po myImages

比调试器会打印出你的数组的内容。希望有帮助

于 2012-05-13T08:18:31.730 回答
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 变量,以便可以在块内对其进行修改。

于 2012-05-13T08:19:53.763 回答