我有这种方法需要一个块,但并不总是调用该块。见方法:

- (void)updateWithCompletion:(void (^)(void))completion {
    [MYObject myMethodWithCompletion:^(NSArray *array, NSError *error) {
        if (error) {
            NSLog(@"%s, ERROR not nil", __FUNCTION__);
            completion();
            return;
        }

        NSLog(@"%s, calling completion %d", __FUNCTION__, &completion);
        completion();
        NSLog(@"%s, finished completion", __FUNCTION__);
    }];
}


我在完成过程中还有一些NSLogs。有时,此程序计数器刚好在上面的代码中对completion()的调用之后结束。我不明白为什么会这样,因为调用代码总是将原义的代码块作为输入传递。

如果您对包含addressof运算符的行的输出感到好奇,它总是有所不同,但绝不会为0或nil。

是什么导致无法执行完成?

最佳答案

事实证明,完成指向的代码块与我期望的不同。从viewWillAppear调用了updateWithCompletion,其中包含一个空代码块。这就是为什么我没有看到NSLog语句的原因。看到我有一个空的代码块后,很明显如何解决问题。

经验教训:如果代码块为零,则程序将崩溃。这没有发生,所以这意味着它正在调用我所期望的以外的东西。

希望这对某人有帮助。

关于iphone - 未调用完成块。如何检查有效性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13810525/

10-11 15:52