2010-02-25 2 views
0

У меня возникла проблема, следуя вашему комментарию.странные несколько файлов скачать - NSURLConnection

.h::

NSMutableData *fileData; 

.m:

NSString *imgfile = [NSString stringWithFormat:@"http://xxxx/01.jpg"]; 
NSURL *fileURL1 = [NSURL URLWithString:imgfile]; 

NSString *audiofile = [NSString stringWithFormat:@"http://xxxx/01.mp3"]; 
NSURL *fileURL2 = [NSURL URLWithString:audiofile]; 

NSURLRequest *request1 = [NSURLRequest requestWithURL:fileURL1 cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0 ]; 
NSURLRequest *request2 = [NSURLRequest requestWithURL:fileURL2 cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0 ]; 

NSArray *connections = [[NSArray alloc] initWithObjects: 
[[NSURLConnection alloc] initWithRequest:request1 delegate:self ], 
[[NSURLConnection alloc] initWithRequest:request2 delegate:self ], 
nil]; 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    fileData = [[NSMutableData alloc] init]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [fileData appendData:data];   
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    NSLog(@"Unable to fetch data"); 
} 

нормально, процесс загрузки работает, но размер файла я бы загрузить другой файл одновременно с другим делегатом нравится из jpg и mp3 неверны, единственная правильная вещь - общий размер файла (jpg + mp3), пожалуйста, можете ли вы посмотреть на код, чего не хватает?

Другой вопрос: я поставил файл в NSMutableArray, мой вопрос в том, как проверить, какой индекс массива является правильным типом файла (jpg и mp3)? потому что мне нужно сохранить их в папку устройства.

ответ

2

Похоже, что оба ваших соединения пишут один и тот же объект fileData, и все ваши проблемы следуют из этого.
Как работать с несколькими соединениями, вы можете видеть relevant question здесь, на SO, есть также nice blog post, содержащий NSURLConnection подкласс, который решает эту проблему.

+0

привет Владимир, спасибо очень много за ответ, я почти там, но я столкнулся с проблемой, мое приложение основано UITableView, я не знаю, как реализовать: @interface CustomURLConnection: NSURLConnection { NSString * тег ; } моего приложения: @interface LessonSubViewController: UITableViewController { } @end , потому что есть предупреждение говорит 'UITableViewController' может не реагировать на '-initWithRequest: делегат: startImmediately:' и это приводит к тому, крах приложения, как я могу его решить? – Georg

+0

Реализовать его как отдельный класс, унаследованный от NSURLConnection, а затем использовать его экземпляр внутри методов LessonSubViewController. – Vladimir

+0

СПАСИБО ВАМ ДЕЙСТВИТЕЛЬНО! Я, наконец, преодолел эту проблему! и узнал урок :) – Georg

0

Вот что я делаю, я поставил счетчик, чтобы определить тип файла для сохранения:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    NSMutableData *dataForConnection = [self dataForConnection:(CustomURLConnection*)connection]; 
    [connection release]; 

    // Do something with the dataForConnection. 

    downloadCount ++; 

// Copy Image Data to ur location using FileManager 
//UIImage *img = [UIImage imageWithData:fileData]; 
NSString *saveDir; 
if (downloadCount ==1) 
    saveDir = [NSString stringWithFormat:@"001.jpg"]; 
if (downloadCount == 2) 
    saveDir = [NSString stringWithFormat:@"001.mp3"]; 

//NSLog(@"saveDir=%@",saveDir); 
NSArray * sysPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString * filePath = [[NSString alloc] initWithFormat: @"%@/%@", [sysPaths objectAtIndex: 0], saveDir]; 
NSLog(@"filePath=%@",filePath); 

if([dataForConnection writeToFile:filePath atomically:YES]) 
    NSLog(@"DONE COPYING"); 
else 
    NSLog(@"Write to device error"); 
//[fileData setLength:0]; 

if (downloadCount == 2) 
{ 
    downloadCount = 0; 
    play the MP3 and display the image file; 
} 

}

даже я запустить приложение на тренажере, файл был скачан без ошибок сообщили , но иногда файл не открывается, даже я пытался открыть его из папки, мне сказали, что файл поврежден, я не понимаю, что не так, надеюсь, вы понимаете, что я говорю.

+0

SO работает не как форум - если у вас есть дополнительная информация, вы должны отредактировать свой начальный вопрос и опубликовать его там (или как новый вопрос), но не ставьте его как ответ – Vladimir

+0

жаль, что комментарий знак ограничение .. поэтому вы читаете мой вопрос?Я борюсь за эту проблему в течение нескольких дней. – Georg

+0

Кажется, вы полагаетесь на то, что 1-е соединение закончится, будет jpg download, 2nd-mp3, но иногда это не так. Правильный способ обработки нескольких подключений должен быть следующим: при создании соединения вы устанавливаете для него тег (например, kJPGConnection для загрузки jpg, kMP3Connection - для mp3). Когда соединение завершено, вы проверяете его тег и выполняете соответствующее действие: if (connection.tag == kJPGConnection) - сохраняйте как jpg. – Vladimir

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