下载时停止NSThread

时间:2009-12-23 02:17:19

标签: iphone xml cocoa nsthread

我有一个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:方法,而我希望它停止,我将如何停止该方法?

3 个答案:

答案 0 :(得分:3)

如果您预计需要控制连接(即,如果用户取消或导航,则停止连接),您应该在解析XML之前使用异步NSURLConnection API来加载数据。除了能够根据需要关闭连接外,您还可以更好地响应网络错误。

正如NSD指出的那样,你应该在驱动XML解析线程的类上实现某种cancel方法 - 然后在用户使用主线程时使用performSelector:onThread:withObject:waitUntilDone:(或类似)取消下载或导航。

答案 1 :(得分:1)

这些是你的线程停止选项

http://developer.apple.com/mac/library/documentation/cocoa/reference/Foundation/Classes/NSThread_Class/Reference/Reference.html#//apple_ref/doc/uid/20000311-DontLinkElementID_12

从指南的其他地方

“如果您预计需要在操作过程中终止线程,则应该从一开始就设计线程以响应取消或退出消息。”

答案 2 :(得分:0)

也许您应该查看NSOperationNSOperationQueue类。

这些类为您提供了对并发和异步执行的大量控制。

基本思想是创建一个队列,然后继承NSOperation。在你的子类的main方法中,做你工作的勇气,在这种情况下,你可以将你的start方法放在这里。

然后,您可以轻松地控制操作,能够设置可以并发运行的操作数,设置某些操作可能对其他操作具有的依赖关系。您也可以轻松取消操作,这是您想要在此处执行的操作。

查看NSOperationNSOperationQueue的文档。