我有一个iPhone应用程序,我正在显示一个从RSS源加载的tableview。加载视图时,我将此方法称为在新的NSThread中运行:
- (void)start:(NSURL*)url {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSXMLParser *XMLParser = [[[NSXMLParser alloc] initWithContentsOfURL:url] autorelease];
[XMLParser setDelegate:self];
if (items) {
[items release];
}
items = [[NSMutableArray alloc] init];
[self startParsing:XMLParser];
[pool drain];
}
它工作正常,但是如果用户在下载或解析xml时离开了视图,我希望线程停止运行,但是如何在不泄漏内存的情况下阻止它运行?此外,如果它正在运行-initWithContentsOfURL:方法,而我希望它停止,我将如何停止该方法?
答案 0 :(得分:3)
如果您预计需要控制连接(即,如果用户取消或导航,则停止连接),您应该在解析XML之前使用异步NSURLConnection
API来加载数据。除了能够根据需要关闭连接外,您还可以更好地响应网络错误。
正如NSD指出的那样,你应该在驱动XML解析线程的类上实现某种cancel
方法 - 然后在用户使用主线程时使用performSelector:onThread:withObject:waitUntilDone:
(或类似)取消下载或导航。
答案 1 :(得分:1)
这些是你的线程停止选项
从指南的其他地方
“如果您预计需要在操作过程中终止线程,则应该从一开始就设计线程以响应取消或退出消息。”
答案 2 :(得分:0)
也许您应该查看NSOperation
和NSOperationQueue
类。
这些类为您提供了对并发和异步执行的大量控制。
基本思想是创建一个队列,然后继承NSOperation。在你的子类的main方法中,做你工作的勇气,在这种情况下,你可以将你的start方法放在这里。
然后,您可以轻松地控制操作,能够设置可以并发运行的操作数,设置某些操作可能对其他操作具有的依赖关系。您也可以轻松取消操作,这是您想要在此处执行的操作。
查看NSOperation和NSOperationQueue的文档。