IOS访问 block 外的变量

标签 ios iphone objective-c icarousel

<分区>

我有以下内容:

    __block ALAssetsGroup* album = nil;
    ALAssetsLibrary* library = [ALAssetsLibrary new];
      [library enumerateGroupsWithTypes: ALAssetsGroupAlbum
                           usingBlock:
     ^ (ALAssetsGroup *group, BOOL *stop) {
         if (group) {
             NSString* title =
             [group valueForProperty: ALAssetsGroupPropertyName];
             if ([title isEqualToString: @"Test1"]) {
                 album = group;
                 *stop = YES;
                 NSLog(@"sd%@", album.description);
             }
         } else { // afterwards
            self.images = [self showFirstPhotoOfGroup:album]; // (oreilly, programming ios 7, ch.17)
            NSLog(@"A:%d",[_images count]);   // return photo count

             if (!album) {
                 NSLog(@"%@", @"failed to find album");
                 return;
             }


         }
     }
     ];

    NSLog(@"B:%d",[_images count]);

NSLog A:正确地将相册中的项目数显示为 2。

NSLog B:显示0。事实上,它在 block 之前被处理!

我明白为什么它会这样做 - 但这是苹果提供的示例。请你告诉我如何让 _images 将其值保留在 block 之外。该 block 似乎具有完全不同的范围。

多年来我一直在尝试将专辑加载到数组中 - 但这个 block 示例并不能在 block 之外保存它的值!

最佳答案

答案的线索在于您自己的观察 - NSLog B 在 NSLog A 之前处理。方法 enumerateGroupsWithTypes:usingBlock:failureBlock 被记录为 异步,因此它可以在枚举任何内容之前返回。所以你的问题与保留值等无关,而只是你在工作完成之前寻找结果。

您必须设计您的应用程序,以便在枚举完成后完成任何依赖于枚举的事情。 enumerateGroupsWithTypes 的文档指出,在枚举完成后,将再次调用该 block 并传递 nil,您需要对此进行测试并使用它来触发相关操作。

HTH

关于IOS访问 block 外的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23938789/

上一篇:ios - 使用 Node (fs writeStreams)保存图像将标题插入文件

下一篇:ios - 在一个 View Controller 中的多个 View 之间切换

相关文章:

ios - 如何通过 Firebase 邀请通过动态链接发送用户信息

ios - iOS Facebook SDK 3.1 的设置按钮不起作用

iphone - 如何获取按计算值排序的托管对象

iphone - 当我们单击表格 View 单元格中的按钮时,如何检索该特定单元格标签中的文本

ios - FIPS_mode_set失败:指纹不匹配

ios - 在 iOS 中当设备语言为阿拉伯语时显示英文键盘和类型

javascript - Phonegap - 如何从索引页面调用另一个文件中的一个 javascript 函数?

ios - APNS Tester 推送通知失败

iphone - 在iOS应用程序中显示 "Tip of the day"(不使用服务器)

ios - 如果我要复制 NSObject 子类,是否需要复制其类型 "UIViewAnimationOptions"和 BOOL 类型的属性?如果是这样,怎么办?