簡體   English   中英

未調用完成塊。 如何檢查有效性?

[英]Completion block not being called. How to check validity?

我有這種方法需要一個塊,但並不總是調用該塊。 見方法:

- (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語句的原因。 看到我有一個空的代碼塊后,很明顯如何解決問題。

獲得的經驗:如果代碼塊為nil,程序將崩潰。 這沒有發生,所以這意味着它正在調用我所期望的以外的東西。

希望這對某人有幫助。

您是什么意思,程序計數器越過了程序段? 完成塊幾乎總是異步執行的。 這意味着,是的,程序計數器將從調用-myMethodWithCompletion:之前的-myMethodWithCompletion:直接跳轉到方法的末尾,並在此返回給調用方。 然后在將來的某個時刻,將調用完成模塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM