2017-12-22 3 views
0

私はコンタクトブックを使ってアプリを開発しています。私はAPIからの通話履歴を表示しています。履歴データを表示すると、連絡先が連絡先の中にあるかどうかを確認します。利用可能な場合は、連絡先の名前と画像を表示します。 私はバックグラウンドでこのプロセスを行っていますが、時には、テーブルビューが固まっていて何の応答も出さない場合があります。 私は、上記のプロセスを実行するために、次のコードを使用しています:コンタクト画像をバックグラウンドで読み込むには?

for i in (0..<arrdata.count-1) 
{ 
    self.count = self.count + 1 
    let dict_data = arrdata.value(forKey: String(format: "%d", arguments: [i])) as! NSDictionary 

    let dict = NSMutableDictionary() 
    dict.setValue(dict_data["callstart"], forKey: "callstart") 
    dict.setValue(dict_data["notes"], forKey: "notes") 
    dict.setValue(dict_data["debit"], forKey: "debit") 
    dict.setValue(dict_data["pattern"], forKey: "pattern") 
    dict.setValue(dict_data["calltype"], forKey: "calltype") 
    dict.setValue(dict_data["billseconds"], forKey: "billseconds") 
    dict.setValue(dict_data["disposition"], forKey: "disposition") 
    dict.setValue(dict_data["callednum"], forKey: "callnumber") 

    DispatchQueue.global(qos: .background).async(execute: 
    {() -> Void in 
     let searchContact = Constants.appDelegate.searchForContactUsingPhoneNumber(phoneNumber: dict_data["callednum"] as? String) as [ContactEntry] 
     if searchContact.count == 1 
     { 
      for contact in searchContact 
      { 
       dict.setValue(contact.name, forKey: "callednum") 
       dict.setValue(contact, forKey: "historycontact") 
       if contact.image == nil 
       { 
        dict.setValue(nil, forKey: "contactimage") 
       } 
       else 
       { 
        let new_image = contact.image?.scaleUIImageToSize(image: contact.image!, size: CGSize(width:250,height:250)) 
        let imgdata = new_image?.jpeg(.lowest) 
        dict.setValue(imgdata, forKey: "contactimage") 


       } 
      } 
     } 
     else 
     { 
      dict.setValue(nil, forKey: "historycontact") 
      dict.setValue(dict_data["callednum"], forKey: "callednum") 
      dict.setValue(nil, forKey: "contactimage") 

     } 
    }) 
    dict.setValue(nil, forKey: "historycontact") 
    dict.setValue(dict_data["callednum"], forKey: "callednum") 
    dict.setValue(nil, forKey: "contactimage") 
    dict.setValue(dict_data["callerid"], forKey: "callerid") 
    self.arrHistory.append(dict) 
} 

DispatchQueue.main.async 
{ 
    self.tblview.reloadData() 
} 

は、バックグラウンドキューでは、私は可能な連絡先を確認したりありません。

私はバックグラウンドで連絡先の検索が必要で、メインスレッドのバックグラウンドとAPIコールでデータを設定する必要がありました。

上記の問題の解決策があれば、私に手伝ってください。

ありがとうございます。

答えて

1

ここにはいくつかの潜在的な問題があります。 forループのバックグラウンドスレッドを取得すると(データに応じて)スレッドが大量に消費される可能性があります。これはあなたのアプリが応答しなくなる原因になります。私はあなたのバックグラウンドスレッドが完了したときにあなたが達成しようとしていることを完全には分かっていません。

最初からバックグラウンドキューにディスパッチしたい場合は、すべての処理を実行し、最後にメインスレッドに戻してtableviewを更新します。次のようなもの:

DispatchQueue.global(qos: .background).async(execute: {() -> Void in 
    for i in (0..<arrdata.count-1) 
    { 
     self.count = self.count + 1 
     let dict_data = arrdata.value(forKey: String(format: "%d", arguments: [i])) as! NSDictionary 

     let dict = NSMutableDictionary() 
     dict.setValue(dict_data["callstart"], forKey: "callstart") 
     dict.setValue(dict_data["notes"], forKey: "notes") 
     dict.setValue(dict_data["debit"], forKey: "debit") 
     dict.setValue(dict_data["pattern"], forKey: "pattern") 
     dict.setValue(dict_data["calltype"], forKey: "calltype") 
     dict.setValue(dict_data["billseconds"], forKey: "billseconds") 
     dict.setValue(dict_data["disposition"], forKey: "disposition") 
     dict.setValue(dict_data["callednum"], forKey: "callnumber") 


     let searchContact = Constants.appDelegate.searchForContactUsingPhoneNumber(phoneNumber: dict_data["callednum"] as? String) as [ContactEntry] 
     if searchContact.count == 1 
     { 
      for contact in searchContact 
      { 
       dict.setValue(contact.name, forKey: "callednum") 
       dict.setValue(contact, forKey: "historycontact") 
       if contact.image == nil 
       { 
        dict.setValue(nil, forKey: "contactimage") 
       } 
       else 
       { 
        let new_image = contact.image?.scaleUIImageToSize(image: contact.image!, size: CGSize(width:250,height:250)) 
        let imgdata = new_image?.jpeg(.lowest) 
        dict.setValue(imgdata, forKey: "contactimage") 


       } 
      } 
     } 
     else 
     { 
      dict.setValue(nil, forKey: "historycontact") 
      dict.setValue(dict_data["callednum"], forKey: "callednum") 
      dict.setValue(nil, forKey: "contactimage") 

     } 
     dict.setValue(nil, forKey: "historycontact") 
     dict.setValue(dict_data["callednum"], forKey: "callednum") 
     dict.setValue(nil, forKey: "contactimage") 
     dict.setValue(dict_data["callerid"], forKey: "callerid") 
     self.arrHistory.append(dict) 
    } 

    DispatchQueue.main.async { 
     self.tblview.reloadData() 
    } 
}) 
+0

ありがとうございました。私はあなたの解決策を試みます。 –

関連する問題