【问题标题】:IOS access a variable outside a block [duplicate]IOS访问块外的变量[重复]
【发布时间】:2014-05-29 17:00:43
【问题描述】:

我有以下几点:

    __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之前处理的!

我理解它为什么这样做 - 但这是 Apple 提供的示例。请你告诉我如何让 _images 在块之外保持它的价值。这个块看起来有一个完全不同的范围。

多年来,我一直在尝试将专辑加载到数组中 - 但这个块示例在块之外没有保留它的值!

【问题讨论】:

    标签: ios iphone objective-c icarousel


    【解决方案1】:

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

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

    HTH

    【讨论】:

    • 我看过以下内容:stackoverflow.com/questions/3586911/…,并且了解异步线程。但是你提到的零条件不是已经出现在上面的 else 块中了吗?它运行 'NSLog(@"A:%d",[_images count]);'之后用正确的计数。我想也许是一种添加 '[NSThread sleepForTimeInterval:20]; 的方法NSLog(@"B:%d",[__images count]);'在块之后,但它没有工作。是不是只能调用另一个方法,然后再调用另一个方法?这个块如何返回它的值?
    • 有效!已接受块将始终在调用外部函数之后运行。 nil 条件实际上存在于上面..它是 else 块。我只需要在上面的 else 块中指定一个额外的方法:[_carousel reloadData];我的旋转木马重新加载了!如果您在外面将专辑加载到 iCarousel,请查看 oreilly:programming ios 7, ch.17.. 可以完成。
    • 谢谢你 x 10!你是对的。我得到它。只能在 else 块中链接后续函数 - 您不能从块中返回值,因为它尚未被处理。块不是方法 - 块是在调用函数完成后处理的隔离段。需要在 else 条件中指定后续操作。我猜苹果有他们的理由!
    • @user910028 - “我猜苹果有他们的理由!” - 它不是 Apple,它是 异步 代码,在任何语言中都会发生同样的情况。而块只是函数,可以同步调用。 HTH
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多