【问题标题】:App not downloading files using NSURLConnection应用程序不使用 NSURLConnection 下载文件
【发布时间】:2014-02-25 08:39:31
【问题描述】:

我有一个应用程序,它循环遍历 URL 数组并下载该数组中的所有文件(10 个小 txt 文件和 1 个大图像文件)。之前我的应用程序可以下载文件,但由于大图像的问题,我不得不将 NSURLConnection 子类化,我认为我还没有完全正确,因为现在没有文件被下载。

为数组 getFiles 的每一项传递一个 URL 并运行:

-(void)getFile:(NSString*)url tag:(NSString*)tag {
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
    FileURLConnection *connection = [[FileURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES tag:tag];
    if (connection) {
        [receivedData setObject:[NSMutableData data] forKey:connection.tag];
    }
}

这里是 NSURLConnection 代表:

-(NSMutableData*)dataForConnection:(FileURLConnection*)connection {
    NSMutableData *data = [receivedData objectForKey:connection.tag];
    return data;
}
- (void)connection:(FileURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSUserDomainMask, YES) objectAtIndex:0]stringByAppendingPathComponent:fileName];
    NSMutableData *dataForConnection = [self dataForConnection:(FileURLConnection*)connection];
    [dataForConnection setLength:0];
}
- (void)connection:(FileURLConnection *)connection didReceiveData:(NSData *)data {
    NSMutableData *dataForConnection = [self dataForConnection:(FileURLConnection*)connection];
    [dataForConnection appendData:data];
}
- (NSCachedURLResponse *)connection:(FileURLConnection *)connection
              willCacheResponse:(NSCachedURLResponse*)cachedResponse {
    return nil;
}
- (void)connectionDidFinishLoading:(FileURLConnection *)connection {
    NSLog(@"connectionDidFinishLoading run");
    NSMutableData *dataForConnection = [self dataForConnection:(FileURLConnection *)connection];
    NSString *fileName = connection.tag;
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]stringByAppendingPathComponent:fileName];
    [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
    file = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
    [file seekToEndOfFile];
    [file writeData:dataForConnection];
    [file closeFile];
}

编辑:如果我在 getFile 中 NSLog 接收到的数据(NSDictionary),它会更新“标签”对象,但没有数据与之相关:

"accomodation.txt" = <>;
"future-congress-dates.txt" = <>;
"general-file.txt" = <>;
...

我还尝试为每个委托对 dataForConnection (NSMutableData) 进行 NSLog 记录,但没有打印任何内容:

NSLog(@"dataForConnection %@", dataForConnection);

【问题讨论】:

  • 您的连接立即开始,此时您尚未在 receivedData 对象中设置空的可变数据。设置空数据后是否尝试启动它?此外,仅使用 - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag 的 NSData 方法将数据写入文件可能更简单。
  • 好的,我需要搬到哪里去?另外,我现在正在查找 writeToFile,看看是否可以在我的示例中使用它。
  • 试试这个:FileURLConnection *connection = [[FileURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO tag:tag]; if (connection) { [receivedData setObject:[NSMutableData data] forKey:connection.tag]; [连接开始]; }
  • 啊,我明白了。好的,我试过了,还是没有下载文件。

标签: ios objective-c cocoa-touch nsurlconnection


【解决方案1】:

好吧,我投降了。 有完整代码:

文件URL连接:

@interface FileURLConnection: NSURLConnection

@property (nonatomic, strong) NSFileHandle *file;

@end

getFile函数:

-(void)getFile {
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:fullURL]];
    FileURLConnection *conn = [[FileURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
}
- (void)connection:(FileURLConnection*)connection didReceiveResponse:(NSURLResponse *)response {
    NSString *fileName = [[response URL] lastPathComponent];
    NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]stringByAppendingPathComponent:fileName];
    [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
    connection.file = [NSFileHandle fileHandleForUpdatingAtPath:filePath];
}
- (void)connection:(FileURLConnection *)connection didReceiveData:(NSData *)data {
    [connection.file writeData:data]; 
}
- (NSCachedURLResponse *)connection:(FileURLConnection *)connection
              willCacheResponse:(NSCachedURLResponse*)cachedResponse {
    return nil;
}
- (void)connectionDidFinishLoading:(FileURLConnection *)connection {
    NSLog(@"Connection is %@", connection);
    [connection.file closeFile];
}
- (void)connection:(FileURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"error - %@", error);
}

原问题:App crashing when downloading a large file - NSFileHandle seekToEndOfFile

【讨论】:

  • 您好,我不得不再次问这个问题的原因是在实现您的答案之后,代码似乎可以正常工作。经过反复测试,虽然我会得到与以前相同的错误(间歇性):'*** -[NSConcreteFileHandle seekToEndOfFile]:没有这样的过程'。此代码如何“知道”哪个连接断开以及哪个连接返回?接收到的数据和需要保存到的文件似乎没有加强(我认为这是最初的问题?)。
  • 这也是为什么我更改代码以包含其他 SO 问题似乎指向的“标签”作为问题的解决方案,尽管我找不到适用于我的案例的示例 -可能是我犯的一个错误,但我正在努力追根究底。
猜你喜欢
  • 2011-01-13
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 2012-02-11
相关资源
最近更新 更多