Xunil
Xunil

Reputation: 305

Stop NSThread while downloading

I have an iPhone app, where I'm displaying a tableview, that's loaded from an RSS feed. When the view is loaded, I call this method to run in a new 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];
}

It's working fine, but if the user leaves the view while it's downloading or parsing the xml, I want the thread to stop running, but how would I stop it from running without leaking memory? Also, if it's running the -initWithContentsOfURL: method while I want it to stop, how would I stop that method?

Upvotes: 0

Views: 2470

Answers (3)

Jasarien
Jasarien

Reputation: 58448

Perhaps you should look into the NSOperation and NSOperationQueue classes.

These classes give you a massive amount of control over concurrency and asynchronous execution.

The basic idea is to create a queue, and then subclass NSOperation. Inside your subclasses' main method, do the guts of your work, in this case, you could put your start method inside here.

Then you can control the operation easily, being able to set how many operations can run concurrently, set up any dependencies some operations may have on others. You can also easily cancel operations, which is what you want to do here.

Check out the documentation for NSOperation and NSOperationQueue.

Upvotes: 0

pix0r
pix0r

Reputation: 31280

If you anticipate needing to control connections (i.e. stopping a connection if the user cancels or navigates away) you should probably use the asynchronous NSURLConnection API to load your data before parsing the XML. In addition to giving you the ability to close connections as needed, you'll also be able to better respond to network errors.

As NSD pointed out, you should probably implement some sort of cancel method on the class that's driving your XML parsing thread - then just use performSelector:onThread:withObject:waitUntilDone: (or similar) from your main thread when the user cancels the download or navigates away.

Upvotes: 3

Azeem.Butt
Azeem.Butt

Reputation: 5861

These are your thread stopping options

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

And from elsewhere in the guide

"If you anticipate the need to terminate a thread in the middle of an operation, you should design your threads from the outset to respond to a cancel or exit message."

Upvotes: 1

Related Questions