开发者

How to make NSURLConnection file download work?

I have a ViewController declared as:

@interface DownloadViewController : UIViewController 
           <UITableViewDataSource, UITableViewDelegate>

and I want to use NSURLConnection to download files. NSURLConnection simply "doesn't start", the delegate methods d开发者_高级运维on't work (for example connection:didReceiveResponse is never called) . I noticed in some sample code that the class was subclassing NSObject instead of UIViewController.

How do I combine it? I want to use ViewController methods but then I can't use NSURLConnection.

It's not so easy to find a fully explained example how to download file with NSURLConnection. Everyone only concentrates on the easy methods like didReceiveResponse.


Using a UIViewController instead of an NSObject should not be your problem here ! I'm using a NSURLConnection in an UIViewController with no issue ! Here is a part of my code (not sure it will compile as it is) :

//
//  MyViewController.h
//

#import <Foundation/Foundation.h>

@interface MyViewController : UIViewController {
    @protected
    NSMutableURLRequest* req;
    NSMutableData* _responseData;
    NSURLConnection* nzbConnection;
}

- (void)loadFileAtURL:(NSURL *)url;

@end

-

//
//  MyViewController.m
//

#import "MyViewController.h"

@implementation MyViewController

- (void)loadView {  
// create your view here
}

- (void) dealloc {
    [_responseData release];

    [super dealloc];
}

#pragma mark -

- (void)loadFileAtURL:(NSURL *)url {
    // allocate data buffer
    _responseData = [[NSMutableData alloc] init];

    // create URLRequest
    req = [[NSMutableURLRequest alloc] init];
    [req setURL:_urlToHandle];

    nzbConnection = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES];
    [req release];
    req = nil;
}


#pragma mark -

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    // Append data in the reception buffer
    if (connection == nzbConnection)
        [_responseData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    if (connection == nzbConnection) {
        [nzbConnection release];
        nzbConnection = nil;

        // Print received data
        NSLog(@"%@",_responseData);

        [_responseData release];
    }
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    // Something went wrong ...
    if (connection == nzbConnection) {
        [nzbConnection release];
        [_responseData release];
    }
}

@end

If you plan to download large files, consider storing the received packets in a file instead of storing it in memory !


If you're having problems, you could consider using the well regarded ASIHTTPRequest library to manage your download. It takes care of everything for you.

For example, just 2 lines will do it.

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadDestinationPath:fullPathOfWhereToStoreFile];


Use "NSURLConnection asynchronously" search for the term and you'll find source. Or just NSURLConnection.

For example:

NSURLConnection NSURLRequest proxy for asynchronous web service calls

Using NSURLConnection from apple with example code

Objective-C Programming Tutorial – Creating A Twitter Client Part 1

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜