2014-10-06 6 views
2

Я пытаюсь Dowload одновременно несколько файлов из моего собственного сервера, используя этот код:неперехваченного исключения «NSFileHandleOperationException»

- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    // create 
    [[NSFileManager defaultManager] createFileAtPath:strFilePath contents:nil attributes:nil]; 
    _file = [NSFileHandle fileHandleForUpdatingAtPath:strFilePath];// read more about file handle 
    if (_file) { 
     [_file seekToEndOfFile]; 
    } 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)receivedata 
{ 
    //write each data received 
    if(receivedata != nil){ 
     if (_file) { 
      [_file seekToEndOfFile]; 
     } 
     [_file writeData:receivedata]; 
    } 
} 

- (void)connectionDidFinishLoading:(NSURLConnection*)theConnection { 
    //close file after finish getting data; 
    [_file closeFile]; 
} 

- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    //do something when downloading failed 
} 
- (IBAction)downloadFromServer:(id)sender { 

     NSLog(@"File now being downloaded"); 
    while (i<=3) { 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    NSURL *strFileURL =[NSURL URLWithString:[NSString stringWithFormat:@"SomePath/pic%d.png", i]]; 

    [request setURL:strFileURL]; 
    NSURLConnection *conection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 
    [conection start]; 
    strFilePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"pic%d.png", i]]; 

    } 

} 

У меня есть 3 фотографии, pic1.png, pic2.png и pic3.png. Теперь, если я запустил этот код, приложение сохранит только один поврежденный файл с именем pic3.png и автоматически сработает. Мне нужно загрузить все три файла, любые указатели, в которых я ошибаюсь?

ответ

0

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

dispatch_queue_t queue = dispatch_get_global_queue(
                 DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_async(queue, ^{ 
     NSURL *url = [NSURL URLWithString:@"someDirectory/newPics.zip"]; 
     NSError *error = nil; 
     // 2 
     NSData *data = [NSData dataWithContentsOfURL:url options:0 error:&error]; 

     if(!error) 
     { 
      // 3 
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
      NSString *path = [paths objectAtIndex:0]; 
      NSString *zipPath = [path stringByAppendingPathComponent:@"newPics.zip"]; 

      [data writeToFile:zipPath options:0 error:&error]; 

      if(!error) 
      { 

       ZipArchive *za = [[ZipArchive alloc] init]; 
       // 1 
       if ([za UnzipOpenFile: zipPath]) { 
        // 2 
        BOOL ret = [za UnzipFileTo: path overWrite: YES]; 
        if (NO == ret){} [za UnzipCloseFile]; 

        // 3 
        NSString *imageFilePath = [path stringByAppendingPathComponent:@"newPics/pic1.png"]; 
        //[self removeImage:zipPath]; 


        [[NSFileManager defaultManager] removeItemAtPath:zipPath error: &error]; 

        dispatch_async(dispatch_get_main_queue(), ^{ 

          NSURL *fileURL = [NSURL fileURLWithPath:imageFilePath]; 
          [_webV loadRequest:[NSURLRequest requestWithURL:fileURL]]; 



        }); 

       } 

      } 
      else 
      { 
       NSLog(@"Error saving file %@",error); 
      } 
     } 
     else 
     { 
      NSLog(@"Error downloading zip file: %@", error); 
     } 

    }); 

Это самый лучший способ сделать это, быстро и надежно.

0

Совершенно очевидно, что это не сработает. Вы запускаете три асинхронных операции. Каждый раз после запуска асинхронной операции вы храните имя файла в неизвестном месте, но, вероятно, в том же месте. Итак, какое имя файла будет использоваться при завершении первой асинхронной операции? Подсказка: не тот, который, по вашему мнению, он будет использовать.

+0

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

+0

Это ваше программное обеспечение, вы пишете код. – gnasher729

+0

Я не прошу вас написать мне свое программное обеспечение, я только просил фрагмент, который мог бы прояснить вашу точку зрения, чтобы помочь мне с первого раза в этих ситуациях –

0

Не используйте простой цикл while для повторения операций REQUEST. На самом деле Apple сама у них так много встроенных библиотек. так что лучше всего я предлагаю вам попробовать "NSOPERATION QUEUE". Таким образом, лучше вы можете проверить с Apple, Notes сайта разработчика, то вы получите четкое представление о том: [1] https://developer.apple.com/library/IOs/documentation/Cocoa/Reference/NSOperationQueue_class/index.html

Для Как можно обрабатывать различные запрос с использованием NSOperation - Как AddOperation или RemoveOperation, WaitUntilItFinishTheThread ..