我正在尝试从保存的相册中创建符合特定条件的所有图像的数组。这是一个简化的代码。我将照片添加到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;
答案 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变量,以便可以在块中修改它。