0

我有一个 iPhone 应用程序,我在其中显示一个从 RSS 提要加载的表格视图。加载视图后,我调用此方法在新的 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: 方法,而我希望它停止,我将如何停止该方法?

4

3 回答 3

3

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

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

于 2009-12-23T02:32:09.333 回答
1

这些是您的线程停止选项

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

从指南的其他地方

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

于 2009-12-23T02:22:57.170 回答
0

也许你应该看看NSOperationandNSOperationQueue类。

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

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

然后您可以轻松控制操作,能够设置可以同时运行的操作数量,设置某些操作可能对其他操作的依赖关系。您还可以轻松地取消操作,这正是您要在此处执行的操作。

查看NSOperationNSOperationQueue的文档。

于 2009-12-23T03:00:52.970 回答