2017-01-11 7 views
0

別のView Controllerにある別のimageView.imageに画像を追加しようとしていますが、segueの準備をしていますが、 bgのスレッドでは、それを更新するためにメインスレッドにホップ、それは動作しません。しかし、私が発送物を取り除くと、それは機能します。コードは次のとおりです。segueを実行するときにメインスレッドでUIが更新されない

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    SwiftSpinner.show(progress: 0.2, title: "Loading full image, please wait...") 
    let vc = segue.destination as! PhotoViewController 
    let cell = sender as! UICollectionViewCell 
    DispatchQueue.global(qos: .background).async { 
     if let indexPath = self.collectionView?.indexPath(for: cell) { 
      let url = URL(string: self.images[indexPath.row].rawURL) 
      let imageData = NSData(contentsOf: url!) 
      let image = UIImage(data: imageData as! Data) 
      DispatchQueue.main.async { 
       vc.image = image! 
       vc.mainImage = image! 
       vc.photographerName = self.images[(indexPath.row)].photographerName 
       SwiftSpinner.hide() 
      } 
     } 
    } 
} 
+1

バックグラウンドスレッドのコレクションビューにアクセスしようとしている場合、私は驚くことはありませんが、このアプローチでは心配しないでください。代わりに、PhotoViewControllerへのURLを渡す必要があります。イメージをダウンロードする必要があります。これはprepareForSegueメソッドで行うべきではありません。 – dlbuckley

+0

申し訳ありませんが、DispatchQueue.globalとDispatchQueue.main.asyncを削除すると、なぜ動作するのですか? –

+0

おそらく、あなたがメインスレッドのcollectionViewにアクセスしているからです。上記の私の答えを参照してください;) – dlbuckley

答えて

0

このような場合は、KingFisherをお勧めします。それはすべての迷惑メールを取り、それをそれに変えます:

. . . 
let cell = sender as! UICollectionViewCell 
let url = URL(string: self.images[indexPath.row].rawURL) 
vc.imageView.kf.setImage(with: url) 
. . . 

しかし、そうです。 @ dlbuckleyは正しいです。あなたがKingFisherのようなことをしないとprepareForSegueでそのことをしないでください。

+1

はい。 Nukeを使ってイメージをロードしていました。ありがとう:) –

関連する問題