2016-12-10 7 views
0

FlickrからTableViewで画像を表示するための小さなアプリケーションを作成しています。アプリケーションは正常に動作しますが、私はテーブルビューをスクロールしている間に問題に直面しています。私は問題がGCDやスレッドであると思っています。私はネットワーキングとGCDの新機能ですが、これはFlickr APIから画像を取得するコードです。ネットワークから画像を表示しているときのテーブルビューの遅れ

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = flickrTableView.dequeueReusableCellWithIdentifier("cell") as! FlickerTableCell 
    let flickr = flickrArray[indexPath.row] 
    dispatch_async(dispatch_get_main_queue(), { 
    cell.imageViewFlickr.image = flickr.getFlickrImage() 
    }) 

    cell.labelFlickrTitle.text = flickr.title 
    return cell 
} 

// Flickrの

func getFlickrImage()->UIImage{ 
    let imageURL = NSURL(string: "https://farm\(farm).staticflickr.com/\(server)/\(photoId)_\(secret)_m.jpg")! 
    var flickrImage = UIImage() 
    if let imageData = NSData(contentsOfURL: imageURL) { 
      flickrImage = UIImage(data: imageData)! 

    } else { 

     print("Image does not exist at \(imageURL)") 
    } 
    return flickrImage 
} 

答えて

1

からgetFlickrImage(あるネットワークから画像を取得するあなたの方法で画像を取得する機能)は、応答のために、ネットワークの呼があるようにテーブルセルを待つ同期方法であって、メインスレッドでは、UIがフリーズしたり遅れたりします。あなたは非同期方式でネットワーク呼び出しをラップし、のようなメインスレッドでUIを更新するために、完了ハンドラを使用することができます。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = flickrTableView.dequeueReusableCellWithIdentifier("cell") as! FlickerTableCell 
    let flickr = flickrArray[indexPath.row] 
    flickr.getFlickrImage { (photo) in 
     dispatch_async(dispatch_get_main_queue(), { 
      cell.imageViewFlickr.image = photo 
     }) 
    } 
    cell.labelFlickrTitle.text = flickr.title 
    return cell 
} 
+0

速いためabhijeet-マリック@ありがとう:あなたのcellForRowAtIndexPathは次のようになります

func getFlickrImage(completion:UIImage ->()){ let imageURL = NSURL(string: "https://farm\(farm).staticflickr.com/\(server)/\(photoId)_\(secret)_m.jpg")! var flickrImage = UIImage() let download = dispatch_queue_create("download", nil) dispatch_async(download) { if let imageData = NSData(contentsOfURL: imageURL) { dispatch_async(dispatch_get_main_queue(), { flickrImage = UIImage(data: imageData)! completion(flickrImage) }) } else { print("Image does not exist at \(imageURL)") completion(flickrImage) } } } 

応答、それは本当に私のために働く+1 –

関連する問題