2017-02-08 6 views
0

最初のビューコントローラでは、Googleのようなさまざまなサイトがスタックオーバーフローするテーブルビューがあります...追加されたサービスごとに、そのサイトの最初の文字に基づいて画像が読み込まれます。そのため、Tの画像がTwitter用に読み込まれます。スウィフトテーブルビューのセル画像の最初にロードされていない

ユーザーは、そのセルをタップして2番目のVCに移動してURLを追加することができます。ユーザーが最初のVCに戻ってくると、そのサイトは文字イメージの代わりにファビコンを引っ張ろうとします...これはうまくいきますが、正常には動作しません。

私が最初に望んでいたのは、各画像が読み込まれるとすぐに表示されることでした。明らかにすべてではなく、ユーザーのアプリケーションとのやり取りが中断されることはありませんでした。

現在、何が起こっているかは、一度にいくつか表示されています(これは正常です)が、最初は適切な場所には表示されません。だから私はアマゾン、グーグル、マイクロソフト、フェイスブック、リンゴを持っていると言う...ファビコンは実際には順序が狂っているので、マイクロソフトではグーグルのロゴがあり、数秒後にはFacebookに移行し、もう一度シフトして、それが正しいマッチングの場所に来るまで...これはまた、私が '折りたたみの下で'スクロールして、いくつかの瞬間が正しくなると起こります(セルのタイトルはそのままです)。コードが間違っていて、最低でもFacebookを最初に作ってからグーグル・グーグルなどを好きになるだろう

または別のオプションは、すべての画像が文字画像として開始してからコードファビコンと交換しようとする... ..

すべてのヘルプは素晴らしいことだ。ここ

ユーザーインターフェイスを変更しているので、

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "serviceCell", for: indexPath as IndexPath) as! ServiceTableViewCell 
    let row = indexPath.row 

    cell.serviceNameLabel.text = serviceArray[row].serviceName 

    DispatchQueue.global().async { 

     let myURLString: String = "http://www.google.com/s2/favicons?domain=\(self.serviceArray[row].serviceUrl)" 

     if let myURL = URL(string: myURLString), let myData = try? Data(contentsOf: myURL), let image = UIImage(data: myData) { 

     cell.serviceLogoImage.image = image 

     } else { 

     cell.serviceLogoImage.image = UIImage.init(named: "\(self.getLetterOrNumberAndChooseImage(text: self.serviceArray[row].serviceName))") 

     } 
    } 
    return cell 
    } 
} 

答えて

1
cell.serviceLogoImage.image = 

は、メインスレッドから呼び出されなければなりません、私のテーブルビューのcellForRowAtコードです。

Apple Documentation

注ほとんどの場合、唯一のアプリのメイン スレッドからのUIKitのクラスを使用します。これは、UIResponder から派生したクラスや、アプリのユーザーインターフェイスを何らかの方法で操作するクラスに特に当てはまります。

Check this thread背景とメインから別のスレッドを実行する方法。

関連する問題