IOS访问块外的变量

时间:2014-05-29 17:00:43

标签: 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.事实上,它在块之前被处理了!

我理解为什么会这样做 - 但这是Apple提供的例子。请问你能告诉我如何获得_images来保持它在块之外的价值。它似乎有一个完全不同的范围。

我一直试图将一张专辑加载到一个阵列中很长时间 - 但是这个块示例并没有将它的值保留在块外!

1 个答案:

答案 0 :(得分:1)

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

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

HTH