2016-03-28 23 views
1

Ich habe eine TableView mit customCells, wenn der Benutzer die Start-Taste auf einer Zelle drücken, beginnt das Laden. Da es viele solcher Zellen gibt, muss ich dieses Herunterladen parallel (asynchron) implementieren. Für Bilder zum Herunterladen und die Zelle in Tabellenansicht Aktualisierung verwende ich nächsten Code:Bilder für UITableView mit NSURLConnection asynchron herunterladen

#define myAsyncQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 

ich diese Methode in die Asynchron-Warteschlange bin, dass ich parallel Herunterladen von Bildern ermöglichen sollte sollte. - (void) didClickStartAtIndex: (NSInteger) cellIndex withdata:

(CustomTableViewCell*)data 
    { 
dispatch_async(myAsyncQueue, ^{   
self.customCell = data; 
     self.selectedCell = cellIndex; 
     ObjectForTableCell* tmp =[self.dataDictionary objectForKey:self.names[cellIndex]]; 

     NSURLRequest *urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:tmp.imeageURL] 
                cachePolicy:NSURLRequestReloadIgnoringLocalCacheData 
               timeoutInterval:60.0]; 
     self.connectionManager = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self]; 
     }); 
    } 
    -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
    { 
      self.urlResponse = response; 

     NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; 
     NSDictionary *dict = httpResponse.allHeaderFields; 
     NSString *lengthString = [dict valueForKey:@"Content-Length"]; 
     NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
     NSNumber *length = [formatter numberFromString:lengthString]; 
     self.totalBytes = length.unsignedIntegerValue; 

     self.imageData = [[NSMutableData alloc] initWithCapacity:self.totalBytes]; 
    } 

    -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
    { 
      [self.imageData appendData:data]; 
     self.customCell.progressView.progress = ((100.0/self.urlResponse.expectedContentLength)*self.imageData.length)/100; 
      float per = ((100.0/self.urlResponse.expectedContentLength)*self.imageData.length); 
     self.customCell.realProgressStatus.text = [NSString stringWithFormat:@"%0.f%%", per]; 

    } 

    I tried to set this block to queue - main queue - cause its the place where image is already downloaded, 

     -(void)connectionDidFinishLoading:(NSURLConnection *)connection 
     { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      self.customCell.realProgressStatus.text = @"Downloaded"; 

      UIImage *img = [UIImage imageWithData:self.imageData]; 
      self.customCell.image.image = img; 
      self.customCell.tag = self.selectedCell; 
    }); 
      [self.savedImages setObject:img forKey:self.customCell.nameOfImage.text]; 
      NSNumber *myNum = [NSNumber numberWithInteger:self.selectedCell]; 
      [self.tagsOfCells addObject:myNum]; 
     } 

Ohne alle Warteschlangen (wenn ich es kommentieren) funktioniert alles richtig - aber nur 1 Download auf einer Eins. Aber als ich versuchte, Code mit Warteschlangen als Ergebnis zu implementieren, wird nichts heruntergeladen. Ich verstehe, dass ich etwas falsch gemacht habe, aber ich kann es nicht definieren.

Vielen Dank für jede Hilfe im Voraus.

+2

[nur versuchen, diese lib] (https://github.com/rs/SDWebImage) –

+0

@Fahim Ich danke Ihnen für einen Rat, ich lerne, und wollte es selbst implementieren, ohne irgendeine Bibliothek von Dritten, gut zumindest versuchen, es selbst zu tun – Melany

Antwort

2

Wenn Ihr zum Starten sie Form Grundlagen mit Blick Ich denke, man mit NSURLSession als NSURLConnection meisten Umsetzung veraltet waren und nach iOS 9. Für vollständige Referenz URL Session Programming Guide und tutorial

Kommen wir zurück zur Verfügung stehen wird nicht gestartet werden soll auf Ihre Frage sollten Sie etwas ähnliches wie dies tun, nahm es von Tutorial

// 1 
NSURLSessionDownloadTask *getImageTask = 
[session downloadTaskWithURL:[NSURL URLWithString:imageUrl] 

    completionHandler:^(NSURL *location, 
         NSURLResponse *response, 
         NSError *error) { 
     // 2 
     UIImage *downloadedImage = 
      [UIImage imageWithData: 
       [NSData dataWithContentsOfURL:location]]; 
     //3 
     dispatch_async(dispatch_get_main_queue(), ^{ 
     // do stuff with image 
     _imageWithBlock.image = downloadedImage; 
     }); 
}]; 

// 4 
[getImageTask resume]; 

Aber meine persönliche Empfehlung ist für AFNetworking gehen, die für iOS am besten ist, die Vernetzung und weit verbreitet/in iOS-App Welt getestet.

Für Bild-Download mit AFNetworking

[_imageView setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://i.imgur.com/fVhhR.png"]] 
         placeholderImage:nil 
           success:^(NSURLRequest *request , NSHTTPURLResponse *response , UIImage *image){ 
            NSLog(@"Loaded successfully: %d", [response statusCode]); 
           } 
           failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){ 
            NSLog(@"failed loading: %@", error); 
           } 
    ]; 

EDIT: Async Download mit Concurrency

// get main dispact queue 
dispatch_queue_t queue = dispatch_get_main_queue(); 
// adding downloading task in queue using block 
dispatch_async(queue, ^{ 
    NSData* imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageURL]]; 
    UIImage* image = [[UIImage alloc] initWithData:imageData]; 
    // after download compeletes geting main queue again as there can a possible crash if we assign directly 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    _imageWithBlock.image = image; 
    }); 
}); 
+0

Vielen Dank Ja, ich weiß, dass NSURLConnection depre ist ecated, ich werde zu NSURLSession wechseln, aber derzeit muss ich dieses Problem im aktuellen Projekt – Melany

+2

lösen, dann muss dies hilfreich sein http://stackoverflow.com/questions/12655360/images-downloaded-asynchroniconly-appear-inuitableview Nach dem Tippen oder Scrollen –

+0

Vielen Dank für Hilfe)). – Melany

2

Verwenden Sie diesen Beispielcode von Apple, um Ihr Problem des verzögerten Ladens zu lösen.

+0

Dank ein Blick auf das .. – Melany

Verwandte Themen