完成块未被调用。如何检查有效性?

时间:2012-12-10 22:39:01

标签: iphone objective-c ios ipad objective-c-blocks

我有一个接受块的方法,但并不总是调用该块。见方法:

- (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__);
    }];
}

我在完成内部还有一些NSLog。有时这个程序计数器只是吹过上面代码中的completion()调用。我不明白为什么会这样,因为调用代码总是传递一个文字代码块作为输入。

如果您对包含addressof运算符的行的输出感到好奇,那么它总是不同的,但永远不会为0或为零。

什么会导致完成不被执行?

2 个答案:

答案 0 :(得分:1)

事实证明,完成指向的代码块与我预期的不同。 updateWithCompletion是从viewWillAppear调用的,带有一个空代码块。这就是我没有看到NSLog语句的原因。一旦我看到我有一个空的代码块,很明显如何解决问题。

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

希望这有助于某人。

答案 1 :(得分:0)

你是什么意思,程序计数器吹过块?完成块几乎总是异步执行。这意味着,是的,程序计数器将从调用之前的-myMethodWithCompletion:直接跳转到返回给调用者的方法的末尾。然后在将来的某个时刻,将调用完成块。