我有一个接受块的方法,但并不总是调用该块。见方法:
- (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或为零。
什么会导致完成不被执行?
答案 0 :(得分:1)
事实证明,完成指向的代码块与我预期的不同。 updateWithCompletion是从viewWillAppear调用的,带有一个空代码块。这就是我没有看到NSLog语句的原因。一旦我看到我有一个空的代码块,很明显如何解决问题。
经验教训:如果代码块为零,程序将崩溃。这并没有发生,所以这意味着它正在调用的东西不是我期待的东西。
希望这有助于某人。
答案 1 :(得分:0)
你是什么意思,程序计数器吹过块?完成块几乎总是异步执行。这意味着,是的,程序计数器将从调用之前的-myMethodWithCompletion:
直接跳转到返回给调用者的方法的末尾。然后在将来的某个时刻,将调用完成块。