2014-02-25 5 views
1

У меня есть приложение, которое просматривает массив URL-адресов и загружает все файлы в этом массиве (10 небольших файлов txt и 1 файл большого изображения). Раньше у меня было приложение, загружающее файлы нормально, но из-за проблемы с большим изображением мне пришлось подклассифицировать NSURLConnection, и я думаю, что я не совсем понял, что файлы не загружаются.Приложение, не загружающее файлы с помощью 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]; 
} 

EDIT: Если я NSLog в receivedData (NSDictionary) в getFile он обновляет объект «тег», но не имеет данных для его работы:

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

Я также попытался NSLog в dataForConnection (NSMutableData) для каждого делегата, но ничего не печатается:

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

Ваше соединение начинается сразу же, и в этот момент у вас нету установить пустой изменяемые данные в вашем объекте receivedData. Вы пытались запустить его после того, как вы установили пустые данные? Кроме того, было бы проще просто использовать - (BOOL) writeToFile: (NSString *) path atomically: (BOOL) флаг метод NSData для записи данных в файл. – Andrei

+0

Хорошо, что мне нужно переместить где? Кроме того, теперь я просматриваю writeToFile, чтобы узнать, могу ли я заставить его работать в моем примере. – Ryan

+0

Попробуйте следующее: FileURLConnection * connection = [[FileURLConnection alloc] initWithRequest: request delegate: self startImmediately: NO tag: tag]; если (подключение) { [полученData комплектObject: [NSMutableData данные] дляKey: connection.tag]; [соединение старт]; } – Andrei

ответ

1

Хорошо, я сдаюсь. Существует полный код:

FileURLConnection:

@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

+0

Привет, причина, по которой я должен был задать вопрос еще раз, заключается в том, что после того, как вы выполнили свой ответ до того, как код появился, он работает нормально. После повторного тестирования, хотя я бы получил ту же ошибку (с перерывами) по-прежнему: «*** - [NSConcreteFileHandle seekToEndOfFile]: Нет такого процесса». Как этот код «знает», какая связь уходит, а какая возвращается? Кажется, что нет никакой интенсивности для получаемых данных и файла, который нужно сохранить в (что было изначальной проблемой, я думаю?). – Ryan

+0

Вот почему я изменил код, включив «теги», которые другие вопросы SO, казалось, указывали как решение проблемы, хотя я не мог найти пример, который работал в моем случае - вероятно, ошибка, которую я сделал, но я я пытаюсь разобраться. – Ryan

Смежные вопросы