我试图能够从另一个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