2

我已经实现了 NSURLConnectionDownloadDelegate、NSURLConnectionDataDelegate 委托方法,如下所示。

问题是在 connection:didReceiveResponse: 之后, connectionDidFinishDownloading:destinationURL: 被调用但没有 connectionDidFinishLoading: 甚至 connection:didReceiveData: 未被调用。

当我评论 NSURLConnectionDownloadDelegate 方法时,调用其他三个没有任何问题。

我有一个从服务器获取 JSON 的 NSURLConnections。报刊亭使用 NSURLConnectionDataDownloading 委托方法来下载问题。

我该如何管理?

这是我正在实施的所有委托方法

- (void)connection:(NSURLConnection *)connection didWriteData:(long long)bytesWritten totalBytesWritten:(long long)totalBytesWritten expectedTotalBytes:(long long)expectedTotalBytes {

}

- (void)connectionDidFinishDownloading:(NSURLConnection *)connection destinationURL:(NSURL *)destinationURL {

}

- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

}

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

}

- (void) connectionDidFinishLoading:(NSURLConnection *)connection {

}

这是我的 .h 文件

@interface FirstTopViewController : UIViewController <NSURLConnectionDownloadDelegate, NSURLConnectionDataDelegate, NSURLConnectionDelegate, UITableViewDataSource, UITableViewDelegate>

这就是我连接到服务器以获取 JSON 的方式

[[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES];

如果需要,这是下载问题的代码

NSURLRequest *urlReq = [NSURLRequest requestWithURL:myURL];
NKAssetDownload *asset = [currentIssue addAssetWithRequest:urlReq];
[asset downloadWithDelegate:self];

问题在于从服务器获取 JSON 的调用。问题下载工作正常。

4

2 回答 2

2

NSURLConnectionDataDelegate 定义用于将数据加载到内存的委托方法。NSURLConnectionDownloadDelegate:用于直接将资源下载到磁盘文件的委托方法。

然后,如果您在委托中实现了 connectionDidFinishDownloading:destinationURL:。这将通知 NSURLConnection 你想要将数据下载到磁盘文件而不是内存作为 NSData。NSURLConnectionDataDelegate 方法不会被调用。如果您从您的委托类实现中消除 connectionDidFinishDownloading:destinationURL: ,则将调用 connection:DidReceiveData: 。

对于您的情况,为不同的用途实现两个助手委托。

于 2013-06-28T17:22:13.123 回答
1

当您想要获取 JSON 数据时-connection:didReceiveData:,您需要将委托设置为实现 NSURLConnectionDataDelegate 的对象;当您想将问题下载到文件时,委托需要是实现 NSURLConnectionDownloadDelegate 的对象。一个班级不能同时做这两件事。

这在 NSURLConnection 文档中没有得到很好的解释,但是其中的注释NSURLConnection.h使它更加明确:

NSURLConnection 可用于将资源数据直接加载到内存,在这种情况下应该提供 NSURLConnectionDataDelegate,或者用于将资源数据直接下载到文件,在这种情况下使用 NSURLConnectionDownloadDelegate。委托由 NSURLConnection 保留,直到遇到终止条件。这两个委托在逻辑上是基本协议 NSURLConnectionDelegate 的子类。

于 2013-01-25T21:00:38.233 回答