2016-03-28 15 views
1

Bazı hücrelerde Başlat düğmesine bastığınızda, customCells ile bir TableView var, yükleme başlar. Böyle birçok hücre var, bu yüzden bu indirmeyi paralel olarak (eşzamansız olarak) uygulamam gerekiyor. Ben görüntülerin Paralel indirmeye imkan vermelidir gerekiyordu o zaman uyumsuz kuyruğuna bu yöntemi içermektedirEşzamansız olarak UITableView kullanarak görüntüleri indirmek için NSURLConnection

#define myAsyncQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 

: Görüntü indirilmesi ve Tablo görünümünde hücreyi güncellenmesi için sonraki kodu kullanabilirsiniz. - (void) didClickStartAtIndex: (NSInteger) cellIndex withData: Tüm kuyruklar olmadan

(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]; 
     } 

(bunu yorum yaparken) Tüm düzgün çalışır - ama olanlar sadece 1 indirme. Ancak kodları sırayla uygulamaya çalıştığımda, hiçbir şey indirmiyor. Anladığım kadarıyla yanlış anladım ama tanımlayamıyorum.

Şimdiden herhangi bir yardım için çok teşekkürler.

+2

[sadece bu lib deneyin] (https://github.com/rs/SDWebImage) –

+0

@Fahim: 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); } ]; 

DÜZENLEME kullanarak görüntüsü indirilirken için

, bir tavsiye için teşekkür ederim, ben öğreniyorum ve herhangi bir üçüncü parti kütüphanesi olmadan, kendim tarafından uygulamak istedim, en azından kendim – Melany

cevap

2

senin o formu temellerini başlatmak için bakan olursa seni uygulanmasıyla ilgili pek çok kullanımdan kaldırıldı olmuştu NSURLSessionNSURLConnection olarak başlamalı ve geri geliyor komple referans URL Session Programming Guide ve tutorial

için iOS 9. sonrasında kullanılamaz tahmin sorunuzun buna benzer bir şey yapmalıyız öğretici

// 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]; 

dan aldı Ama benim kişisel öneri ağ iOS için en iyisidir ve yaygın olarak iOS uygulaması dünyada test/kullanılan hangi AFNetworking için gitmektir. Zaman uyumsuz indirme kullanarak eşzamanlılık

// 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

teşekkürler vey çok Evet, NSURLConnection'ın kullanımdan kaldırıldığını biliyorum eced, NSURLSession için hareket edecek, ancak şu anda bu projeyi – Melany

+2

içinde çözmem gerekiyor, daha sonra bu yararlı olmalı http://stackoverflow.com/questions/12655360/images-downloaded-asynchronously-only-appear-in-uitableview -after-tap-veya-scroll –

+0

Yardım için çok teşekkür ederim)). – Melany

2

Tembel yükleme sorununuzu çözmek için bu örnek kodu Apple'dan kullanın.

+0

teşekkürler bunu bir göz atın bunu deneyin .. – Melany

İlgili konular