2017-04-09 8 views
0

私は画像のリストをダウンロードし、画像がダウンロードされるとプログレスバーが更新されるiPadアプリを持っています。プログレスバーと画像のダウンロードが一致するようには見えません。プログレスバーは、イメージのダウンロードが完了する前に常に終了します。 UpdateProgressBarメソッドがあり、画像がダウンロードされるたびにプログレスバーがインクリメントされます。プログレスバーが画像のダウンロードと同期していない

-(void)DownloadPhoto{ 
    NSMutableArray *failedDownloads = [[NSMutableArray alloc]init]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
     listPhoto = [CoreDataRead GetPhotoList:[self selectedAccountGuid]]; 
     dispatch_group_t downloadGroup = dispatch_group_create(); 
     for (Photo *item in listPhoto) { 
      NSString *imageName = item.photoName; 
      NSString *myURL = [NSString stringWithFormat:@"%@%@", @"http://acimagedownload.com/photos/", imageName]; 
      NSURL  *url  = [NSURL URLWithString:myURL]; 
      NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

      dispatch_group_enter(downloadGroup); 
      [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 

      if (connectionError == nil && data != nil) 
      { 
       if (data != nil) 
       { 
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
        NSString *documentsDirectory = [paths objectAtIndex:0]; 
        NSString* path = [documentsDirectory stringByAppendingPathComponent: [NSString stringWithFormat:@"%@%@",item.guid, @".png"]]; 

         [data writeToFile:path atomically:YES]; 
         NSLog(@"Photo Downloaded %@!", @""); 
        } 
        else 
        { 
         NSLog(@"image is not downloaded"); 
        } 
       } 
       else if (connectionError != nil) 
       { 
        [failedDownloads addObject:myURL]; 
        NSLog(@"Error %@",[connectionError description]); 
       } 
       else 
       { 
        [failedDownloads addObject:myURL]; 
        NSLog(@"Image Download Failed %@!", @""); 
       } 
       dispatch_group_leave(downloadGroup); 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        [self UpdateProgressBar]; 
       }); 
      }]; 
      dispatch_group_wait(downloadGroup, DISPATCH_TIME_FOREVER); 
     } 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self DownloadVideo]; 
     }); 
    }); 
} 

-(void)UpdateProgressBar{ 
    currentTask = currentTask + 1; 
    NSLog(@"Current Task %@!", [@(currentTask) stringValue]); 
    float progressPercentage = (float)currentTask/(float)taskCount; 
    [self.progressBar setProgress:progressPercentage animated:YES]; 
    if(currentTask == taskCount){ 
     [self ShowDoneAlert]; 
    } 
} 
+0

NSURLConnection 'sendAsynchronousRequest'はiOS 9では廃止されました(NSURLConnectionのほぼすべての部分が廃止されました).2つの主要OSバージョンで廃止されたAPIを使用して新しい開発を行うことは賢明ではありません。 NSURLSessionを使ってコードを書き直すことをお勧めします。 –

+0

UpdateProgressBarのコードは、この質問の適切な部分のようです。 – danh

+0

私はUpdateProgressBarコードを追加しました。 –

答えて

0

それはあなたがその動作を取得しかし、私は気づいた一つのことは、あなたのdispatch_group_wait(downloadGroup, DISPATCH_TIME_FOREVER);があなたのループ内にあるということである理由updateProgressBar方法を見ずに言うのは難しいです。

ループの最初の繰り返しに入り、スレッドの最後でスレッドの実行が停止し、最初のdispatch_group_leaveを待ちます。その後、次の反復まで続きます。

これが望ましい動作であれば(私は疑いがありますが、実際にダウンロードを並行して実行したいと思っています)、おそらくdispatch_semaphore_tまたはシリアルキューを使用するべきです。

+0

私は彼らが相次いで走って欲しいです。私はそれらを並行して走らせていたし、問題があった。 –

+0

問題が見つかりました。カウントが正しくありませんでした。カウントを修正すると、正しく動作するようになりました。 –

+0

ダウンロード戦略に関するアドバイスはありますか? 0から150までの画像をダウンロードできます。 2時に?私は150のスレッドを同時にイメージをダウンロードすることは良い考えではないと思います。 –

関連する問題