2012-09-27 88 views
2

此代碼的工作定製塊內dispatch_async

[[MyManager sharedManager] makeRequestAndParsingfor:someParameters 
              success:^(NSDictionary * dictionary){ 
               // Sucessful response 
               NSLog(@"Success!!"); 
              } 
              failure:^(NSError* error){ 
               // Error response 
               NSLog(@"Failure!");  
              }]; 

但這每當我運行它從來沒有在成功或失敗塊進入的背景相同。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ 
    [[MyManager sharedManager] makeRequestAndParsingfor:someParameters 
               success:^(NSDictionary * dictionary){ 
                // Sucessful response 
                NSLog(@"Success!!"); 
               } 
               failure:^(NSError* error){ 
                // Error response 
                NSLog(@"Failure!");  
               }]; 
}]; 

有人可以解釋我會發生什麼嗎?方法makeRequestAndParsingfor:發出異步請求(再次使用塊),然後解析結果。我的調試器顯示它在第二種情況下從來沒有得到它自己的成功/失敗。在第一種情況下,它就像一種魅力。有任何想法嗎?

回答

1

請問您的方法參數的個數「makeRequestAndParsingfor」使用block_copy(),並存儲在一個強大的變量(得到堆中塊)的回報?還要添加assert(),這樣你就可以驗證你在'makeRequestAndParsingfor'中獲得了兩個塊,甚至在調用另一個之前重新測試。 [過去使用block_copy()是必要的,但現在不是100%肯定。]

請注意,在第二種情況下,'makeRequestAndParsingfor'運行在併發隊列中,其中多個併發隊列可同時調用塊 - 確保您的成功/失敗塊做什麼,但更好的是線程安全的,或者你應該運行在「makeRequestAndParsingfor」(這是我在我的類似構建的應用程序做)主隊列塊。

+0

不,我不使用block_copy()。如果我在主隊列中運行相同的工作。但我不想阻止主線程。可能嗎?你能開一個聊天室嗎? –

+0

我的理解是,蘋果(一次)使用block_copy()中的每個方法它暴露給我們的軟件開發工具包中塊參數傳遞的,但我真的不知道,如果你可以將它們分配到一個強大的變量'hold'them now(might you can)。但是,確定,打開聊天。 –

+0

http://chat.stackoverflow.com/rooms/17256/block-inside-block –