【发布时间】:2013-10-16 10:05:24
【问题描述】:
我遇到了多个线程的问题。情况如下:
我向后端发出异步请求,在某些情况下,需要取消这些请求。取消请求发生在一个单独的线程中。对后端的所有请求都被取消,当我退出屏幕时,多个类实例被释放。
当我收到订单请求取消时,一切正常。但是,有时当我已经在完成方法的中间时会调用取消方法(由于数据的解码和转换需要一点时间)。在这种情况下,应用程序崩溃,向已释放实例发送消息。这不是一个可以轻松缓存的例外,即使我在前一行检查实例是否存在,我也会崩溃。实际上,如果我理解正确的话,finish 和 cancel 方法所在的类的实例会被释放。没关系,问题是在finish方法中间切换了线程,我需要防止这种情况发生。
我的问题是:有没有办法阻止在方法中间切换线程?将此方法声明为一个整体(事务)?或者对于此类问题是否有其他标准解决方案?
我阅读了this post,但我真的不明白它是否可以用于我的情况或如何做到这一点。
编辑:取消
for (XXX *request in [XXX sharedQueue].operations)
{
[request setDelegate:nil];
[request setDownloadProgressDelegate:nil];
[request setUploadProgressDelegate:nil];
[request setQueue:nil];
[request cancel];
}
XXX 是用于请求的类。
方法的顺序
这是调用方法的顺序(在错误的情况下)。 Handler 是处理请求的类。
Handler 1: make request
Handler 1: finish begin
Handler 2: cancel begin
Handler 2: cancel end
Handler 2: dealloc
Handler 1: dealloc
Handler 1: finish middle
处理程序 1 和 2 是该类的两个实例。第一个在完成方法的中间被释放,所以最后我崩溃了。释放它是正常的,因为取消后我转到另一个视图,基本上所有东西都被释放了。
我对解决方案的想法是要么以某种方式阻止返回到finish方法,要么在切换线程之前执行整个finish方法。不幸的是,我不知道如何实现其中之一。
【问题讨论】:
-
您能否详细说明取消是如何完成的?
-
好的,我在问题中添加了取消方法的代码。
标签: ios objective-c multithreading web-services asynchronous