Ich habe eine iPad App, wo ich eine Liste von Bildern und eine Fortschrittsbalkenaktualisierungen herunterladen, wie die Bilder heruntergeladen werden. Ich kann nicht scheinen, dass die Fortschrittsbalken und Bild-Downloads übereinstimmen. Der Fortschrittsbalken wird immer beendet, bevor die Bilder heruntergeladen werden. Ich habe eine Methode UpdateProgressBar, die den Fortschrittsbalken jedes Mal erhöhen sollte, wenn ein Bild heruntergeladen wird.Progress Bar Updates nicht synchron mit Bild-Downloads
-(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];
}
}
'NSURLConnection'' sendAsynchronousRequest' war in iOS 9 veraltet. (In der Tat war fast jeder Teil von NSURLConnection veraltet.) Es ist nicht ratsam, neue Entwicklungen mit APIs zu machen, die vor zwei großen OS-Versionen veraltet waren. Ich schlage vor, den Code mit 'NSURLSession' neu zu schreiben. –
Der Code in UpdateProgressBar scheint ein angemessener Teil dieser Frage. – danh
Ich habe den UpdateProgressBar-Code hinzugefügt. –