2016-08-24 105 views
0

我有一個collectionview,我試圖做一個異步下載,我在cellforItemIndexPath下載一張照片。Swift - 異步顯示圖片下載

我試圖在下載照片後在集合中顯示圖像。

現在照片下載並全部出現。

我嘗試了幾個解決方案(包括下面的一個),但他們都下載了照片並立即顯示。

無論如何要顯示每張照片,因爲它是下載?

照片被下載到Flickr.downloadPhoto中並存儲在名爲photo的核心數據對象中。

我想另一件事是使用一個回調的downloadPhoto,但沒有奏效

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    if(photo.downloaded==0) { 
     Flickr.downloadPhoto(photo, context: self.managedContext) { (success, status) in 

      dispatch_async(dispatch_get_main_queue()) { 
       self.appDelegate.saveContext() 
       cell.photoImageOutlet.image = UIImage(data: photo.image!) 
       self.collectionViewOutlet.reloadData() 
      } 
     } 
    } 
    return cell 
} 

回答

1

嘗試分離collectionView...cellForItemAtIndexPath邏輯和照片下載和移動照片下載過程的後臺線程的邏輯。

最初,在collectionView...cellForItemAtIndexPath,設置所有單元格的圖像是空的:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! YourCustomCellView 
    // Empty image object or whatever placeholder you like 
    cell.photoImageOutlet.image = UIImage() 
return cell 
} 

viewDidLoad()啓動圖像下載過程:

override func viewDidLoad() { 
    // your code 
    // ... 
    // start images downloading in background: 
    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
    dispatch_async(dispatch_get_global_queue(priority, 0)) {() -> Void in 
     // for each photo needed to be downloaded 
     for photo in photos { 
      if photo.downloaded != 0 { 
       continue 
      } 
      Flickr.downloadPhoto(photo, context: self.managedContext) { (success, status) in 
       // Set the cell index you want to assign the image to 
       let cellIndex = photos.indexOf(photo) 
       let cell = self.collectionViewOutlet.visibleCells()[cellIndex] as! YourCustomCellView 
       self.appDelegate.saveContext() 
       cell.photoImageOutlet.image = UIImage(data: photo.image!) 
       // In the main thread call the UI-responsible reloadData() 
       dispatch_async(dispatch_get_main_queue()) { 
        self.collectionViewOutlet.reloadData() 
       } 
      } 
     } 
    } 

} 
+0

感謝您的回覆@Lil_whale;我能夠用你的建議完成任務(後臺隊列和主隊列),我必須將更多東西移到主隊列中(核心數據的線程安全),但是你的概念是正確的。 –

0

我已經使用真棒輕量級庫本

https://github.com/onevcat/Kingfisher

如何使用它

要翠鳥使用的CocoaPods集成到您的Xcode項目,在您的Podfile指定:

source 'https://github.com/CocoaPods/Specs.git' 
platform :ios, '8.0' 
use_frameworks! 

pod 'Kingfisher', '~> 2.4' 
在你的代碼

然後

import Kingfisher 


// Do this in your cellForIndexpath 
your_imageview.kf_setImageWithURL(NSURL(string: "http://your_image_url.png")!) 

圖書館有真棒特點像圖像緩存和預取圖像等