__block变量未保留

时间:2012-01-22 03:10:52

标签: iphone ios

我正在尝试将块中的结果分配给块变量。这是我的代码:

__block UIImage *latestImage;
ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];

// Enumerate just the photos and videos group by using ALAssetsGroupSavedPhotos.
[assetLibrary   enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos 
                              usingBlock:^(ALAssetsGroup *group, BOOL *stop){
                                  // Within the group enumeration bl  ock, filter to enumerate just photos.
                                  [group setAssetsFilter:[ALAssetsFilter allPhotos]];

                                  // Chooses the photo at the last index
                                  [group  enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:([group numberOfAssets]-1)] 
                                                           options:0
                                                        usingBlock:^(ALAsset *alAsset, NSUInteger index, BOOL *innerStop){   
                                                            // the end of the enumeration is signaled by asset == nil.
                                                            if (alAsset){
                                                                ALAssetRepresentation *representation = [alAsset defaultRepresentation];
                                                                latestImage = [UIImage imageWithCGImage:[representation fullResolutionImage]];
                                                            }
                                                        }];
                              }
                            failureBlock: ^(NSError *error){
                                // handle error
                                NSLog(@"No groups");
                            }
 ];
return latestImage;

我确认变量latestImage是在块中设置的,方法是在块内部的UIImageView上显示它。但是,当我尝试返回上面代码中显示的那个对象时,它什么都不返回。

我错过了什么?

感谢。

1 个答案:

答案 0 :(得分:0)

enumerateGroupsWithTypes:usingBlock:failureBlock:是异步的。在块有机会设置变量之前,您将返回latestImage。从ALAssestsLibrary上的文档:

  

ALAssetsLibrary声明的许多方法都会失败   作为一个论点。这些方法都是异步的,因为用户   可能需要被要求授予对数据的访问权。

您可以将整个函数包装在dispatch_sync()中,也可以使用信号量等待答案。无论哪种方式,请确保您没有在主线程上执行此操作。