Как заставить загрузку файла NSURLConnection работать? - PullRequest
1 голос
/ 27 апреля 2011

У меня ViewController, объявленный как:

@interface DownloadViewController : UIViewController 
           <UITableViewDataSource, UITableViewDelegate>

, и я хочу использовать NSURLConnection для загрузки файлов. NSURLConnection просто "не запускается", методы делегата не работают (например, connection: didReceiveResponse никогда не вызывается).В некотором примере кода я заметил, что класс подклассов NSObject вместо UIViewController.

Как мне это объединить?Я хочу использовать методы ViewController, но тогда я не могу использовать NSURLConnection .

Не так просто найти полностью объясненный пример, как загрузить файл с NSURLConnection.Каждый концентрируется только на таких простых методах, как didReceiveResponse .

Ответы [ 3 ]

3 голосов
/ 27 апреля 2011

Если у вас возникли проблемы, вы можете использовать хорошо зарекомендовавшую себя библиотеку ASIHTTPRequest для управления загрузкой.Он обо всем позаботится за вас.

Например, всего две строки сделают это.

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadDestinationPath:fullPathOfWhereToStoreFile];
3 голосов
/ 27 апреля 2011

Использование UIViewController вместо NSObject не должно быть вашей проблемой здесь!Я использую NSURLConnection в UIViewController без проблем!Вот часть моего кода (не уверен, что он будет скомпилирован как есть):

//
//  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

Если вы планируете загружать большие файлы, рассмотрите возможность хранения полученных пакетовв файле вместо сохранения в памяти!

1 голос
/ 27 апреля 2011
...