2017-10-25 8 views
0

7MBのJSONファイルをダウンロードした後、そのデータ(30000データセット)を領域に追加します。Swift:Realm - DBにデータを追加中にUI(進行)を更新します

UI(ラベルまたは何か)を更新することはできませんデータセットをループしながら

let manager = Alamofire.SessionManager.default 
    manager.session.configuration.timeoutIntervalForRequest = 20 


    manager.request("http://myURL.json") 
     .downloadProgress { progress in 

      self.TitelLabel.text = "loading File :\(String(format: "%.0f", progress.fractionCompleted * 100))%" 


     } 
     .responseJSON { response in 
      print(response.request! as Any) 
      switch response.result { 
      case .success: 

       if let value = response.result.value { 
        self.jsonObj = JSON(value) 
        print(self.jsonObj.count) 


        for i in 0..<self.jsonbj.count{ 
        self.TitelLabel.text = "..adding " + i + " article" 
          let article = Articles() 
    articles.price = self.jsonObj[i]["price"].stringValue.replacingOccurrences(of: "'", with: "´") 
    article.title = self.jsonObj[i]["title"].stringValue.replacingOccurrences(of: "'", with: "´") 
    article.path = self.jsonObj[i]["path"].stringValue 
    article.name = self.jsonObj[i]["name"].stringValue 
    article.weight = self.jsonObj[i]["weight"].stringValue 

    try! realm.write { 
      realm.add(article) 
     } 
        } 
       } 

      default: 
       break 
      } 
    } 
} 

私はパーセントの進展を示すラベルを変更するために何ができます?

+0

最初に30000件の取引ではなく30件の取引を30000件追加することができます。 – EpicPandaForce

+0

あなたの問題は何ですか? –

答えて

1

私はここで2つの問題を見ることができます。まず、レルムへの保存はメインスレッドで行われます。バックグラウンドスレッド内でコードを移動する必要があるからです。次に、領域オブジェクトは1つずつ保存され、ディスク上にデータを保存する最適な方法ではありません。

以下は、forループで置き換えることができるコードです(コメント付き)。

// This is to do the task on background 
DispatchQueue.global(qos: .background).async { 
    // Moved realm.write out of for to improve the performance 
    let realm = try? Realm() 
    try! realm.write { 
    for i in 0..<self.jsonbj.count { 
     // Since this is bg thread so UI task should be done on UI thread 
     DispatchQueue.main.async { 
     self.TitelLabel.text = "..adding " + i + " article" 
     // If you want it in percentage then use the below code 
     //self.TitelLabel.text = "Adding " + (i*100.0/self.jsonbj.count) + "%" 
     } 
     let article = Articles() 
     articles.price = self.jsonObj[i]["price"].stringValue.replacingOccurrences(of: "'", with: "´") 
     article.title = self.jsonObj[i]["title"].stringValue.replacingOccurrences(of: "'", with: "´") 
     article.path = self.jsonObj[i]["path"].stringValue 
     article.name = self.jsonObj[i]["name"].stringValue 
     article.weight = self.jsonObj[i]["weight"].stringValue 

     realm.add(article) 
    } 
    } 
} 
+0

私は試しましたが、それは結果です***キャッチされていない例外 'RLMException'のためアプリを終了しています、理由: '不正なスレッドからアクセスした領域'。 – Marc

+0

次に、ディスパッチブロックに領域オブジェクトを作成する必要があると思います。コードを更新してみてください –

+0

実際には機能しません。残念ながらラベルは値を1つ2回変えてしまいました。 – Marc

関連する問題