1

我有一个 ViewController 声明为:

@interface DownloadViewController : UIViewController 
           <UITableViewDataSource, UITableViewDelegate>

我想使用NSURLConnection下载文件。NSURLConnection只是“不启动”,委托方法不起作用(例如connection:didReceiveResponse永远不会被调用)。我在一些示例代码中注意到该类是子类NSObject化而不是UIViewController.

我如何结合它?我想使用 ViewController 方法,但是我不能使用NSURLConnection

找到一个完整解释的示例如何使用 NSURLConnection 下载文件并不容易。每个人都只专注于像didReceiveResponse这样的简单方法。

4

3 回答 3

3

如果您遇到问题,您可以考虑使用广受好评的ASIHTTPRequest 库来管理您的下载。它会为您处理一切。

例如,只需 2 行即可。

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadDestinationPath:fullPathOfWhereToStoreFile];
于 2011-04-27T12:02:46.387 回答
3

在这里使用 UIViewController 而不是 NSObject 不应该是您的问题!我在 UIViewController 中使用 NSURLConnection 没有问题!这是我的代码的一部分(不确定它会按原样编译):

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

如果您打算下载大文件,请考虑将接收到的数据包存储在文件中,而不是将其存储在内存中!

于 2011-04-27T15:31:09.903 回答
1

使用“NSURLConnection 异步”搜索该术语,您会找到源代码。或者只是 NSURLConnection。

例如:

用于异步 Web 服务调用的 NSURLConnection NSURLRequest 代理

使用来自苹果的 NSURLConnection 和示例代码

Objective-C 编程教程 - 创建 Twitter 客户端第 1 部分

于 2011-04-27T12:00:49.520 回答