我正在使用此代码从我的设备中检索所有图像,但它没有返回结果
- (void)viewDidLoad
{
[super viewDidLoad];
void (^assetEnumerator)(ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
if(result != NULL) {
NSLog(@"See Asset: %@", result);
[_assets addObject:result];
// Here storing the asset's image URL's in NSMutable array urlStoreArr
NSURL *url = [[result defaultRepresentation] url];
[_urlStoreArr addObject:url];
}
};
void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop)
{
if(group != nil)
{
[group enumerateAssetsUsingBlock:assetEnumerator];
}
};
_urlStoreArr = [[NSMutableArray alloc] init];
_assets = [[NSMutableArray alloc] init];
_library = [[ALAssetsLibrary alloc] init];
[_library enumerateGroupsWithTypes:ALAssetsGroupAlbum
usingBlock:assetGroupEnumerator
failureBlock: ^(NSError *error) {
NSLog(@"Failure");
}];
[self UploadImagesToServer];
}
-(void) UploadImagesToServer
{
for (int i=0; i<[_urlStoreArr count]; i++)
{
// To get the each image URL here...
NSString *str = [_urlStoreArr objectAtIndex:i];
NSLog(@"str: %@",str);
// Need to upload the images to my server..
}
}
答案 0 :(得分:2)
您在初始化之前使用_urlStoreArr
。
当您定义块时,它们将获取您在块中使用的变量的当前本地值。
因此,在您使用assetEnumerator
的{{1}}块中,但是您要在代码的后面部分对其进行初始化。
我假设_urlStoreArr
是iVar,因为它有一个前导下划线。如果您使用的是ARC,则iVar会初始化为_urlStoreArr
,因此您的nil
阻止正在向assetEnumerator
发送消息。这在Objective-C中是合法的,但它只返回nil
。
您有两种方法可以解决此问题。
nil
的声明移到_urlStoreArr = [[NSMutableArray alloc] init];
块assetEnumerator
尝试[_urlStoreArr addObject:url];
。这是有效的,因为在使用属性访问时,您在定义时没有使用[self.urlStoreArr addObject:url];
的当前值,而是使用块运行时的值,即iVar初始化之后的值。 / LI>
醇>