我試圖能夠從另一個completionHandler塊(在異步URL請求之後調用)內調用'completionHandler'塊。然而,這將導致應用程序與下面的消息崩潰(我使用殭屍對象):
*** -[CFRunLoopTimer hash]: message sent to deallocated instance
在iOS中嵌套塊
使用儀器我能找出這個問題是由於被釋放的塊,但我不能弄清楚如何保持足夠長的時間。是因爲我從另一個異步塊調用該塊嗎?我的代碼如下(MyCompletionHandler返回void
,並採取void
):
-(void)requestWithRequest:(NSURLRequest*)request withCompletionHandler:(MyCompletionHandler)serverCompletionHandler{
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// do stuff…
if (serverCompletionHandler) {
dispatch_async(dispatch_get_main_queue(), ^{
serverCompletionHandler();
});
}];
}
但是這個代碼通過它提供的serverCompletionHandler
參數的另一種方法稱爲(難道這是問題嗎?)。
因此,例如,上述的方法將通過該方法稱爲:
-(void)createAndSendRequestWithCompletionHandler:(MyCompletionHandler)serverCompletionHandler{
NSMutableURLRequest* request = //..
[self requestWithRequest:request withCompletionHandler:serverCompletionHandler];
}
儀器示出了塊被釋放或刪除(I假設我打電話的塊),這將解釋解除分配的對象被稱爲。
任何幫助,將不勝感激。
編輯
定時器(這似乎被釋放)的代碼是:
if ([timer isValid]) {
[timer invalidate];
}
timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(createAndSendRequestWithCompletionHandler:) userInfo:nil repeats:YES];
的令人困惑的事情是代碼工作得很好,直到我說的completionHandler
秒。
同意,但爲什麼當你知道你在上面時,你會檢查你是否在主隊列? sendAsynch的第一個參數指定完成處理程序將被調用的隊列。 – danh
如果你在另一個線程上並在其他隊列上操作'sendAsynchronousRequest',因爲在主隊列上操作此方法並不常見。在這種情況下,我們可以跳過此檢查 – codester
好的。 OP正在使用主隊列,硬編碼。 – danh