2016-12-05 58 views
2

异步我想工作,在后台异步从JSON写的境界,但我不明白为什么我的代码是不是必须工作。境界在后台

override func viewDidLoad() { 
    super.viewDidLoad() 

    myFunc() 

} 

和myFunc的():

func myFunc() { 

     let realm = try! Realm() 

     // get file JSON from local device and write data from it to RealmDB 
     if realm.isEmpty { 

      //local file JSON 
      let file = Bundle.main.path(forResource: "file", ofType: "json")! 
      let url = URL(fileURLWithPath: file) 
      let jsonData = NSData(contentsOf: url)! 

      //Serialization JSON 
      let json = try! JSONSerialization.jsonObject(with: jsonData as Data, options: []) 


      DispatchQueue.main.async { 

      realm.beginWrite() 

      //Create data from JSON to our objects 
      realm.create(DataRoot.self, value: json, update: true) 

      try! realm.commitWrite() 

      } 
     } 
    } 

DB创造,但下一步(因为我看到)是错误的:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     return (transport.filter("id == 1").first?.routes.count)! 
    } 

所以,我想等待在后台完整写入数据库(例如显示进度视图)并转到下一步。

回答

1

你必须检查在numberOfRows方法可选的,做这样的

func myFunc() { 
     let queue1 = DispatchQueue(label: "com.appname.queue") 
     queue1.async { 
      let realm = try! Realm() 
      // get file JSON from local device and write data from it to RealmDB 
      if realm.isEmpty { 

       //local file JSON 
       let file = Bundle.main.path(forResource: "file", ofType: "json")! 
       let url = URL(fileURLWithPath: file) 
       let jsonData = NSData(contentsOf: url)! 

       //Serialization JSON 
       let json = try! JSONSerialization.jsonObject(with: jsonData as Data, options: []) 
       realm.beginWrite() 

       //Create data from JSON to our objects 
       realm.create(DataRoot.self, value: json, update: true) 

       try! realm.commitWrite() 

       DispatchQueue.main.async { 

        self.tableview.reloadData() 

       } 

      } 
     } 
    } 


    override func tableView(_ tableView: UITableView,  numberOfRowsInSection section: Int) -> Int { 
     if let routes = transport.filter("id == 1").first?.routes { 
      return routes.count 
     } 
      return 0 
    } 
1

一般回答你的问题:高级别领域的功能,你想在这里使用是notifications

您应该以这样一种方式构建您的应用程序,以便您希望用于备份视图控制器的数据可以用Realm查询或通知表示,以便在视图或控制器的基础数据发生变化时可以执行相关的视图更新操作。

还有一些其他的问题,你的代码,例如潜在从不同的线程比它创建一个访问Realm实例。我建议你在Realm's Threading documentation阅读更多关于这个。