随着进度将数据插入领域数据库?

时间:2016-03-16 08:32:17

标签: swift realm alamofire progress

我下载了json字符串后,请求数据大约是7MB,意味着json字符串大约是7MB。下载后,我想将数据保存到realm模型对象(表)中,进度如< / p>

(1/7390)至(7390/7390) - &gt; (插入的数据/要插入的总数据)

我在我的应用程序中使用Alamofire作为HTTPClient。那么,从服务器下载后如何将进度数据插入我的领域对象模型?任何帮助都会导致我是初学者。

我不会完全显示数据模型,所以,任何一个例子都是值得赞赏的。让我说我的json字符串是。

{
    {
       name : Smith,
       age : 23,
       address : New York
    },
    {
       name : Adam,
       age : 22,
       address : Maimi
    },
    {
       name : Johnny,
       age : 33,
       address : Las Vegas
    },
    ... about 7392 records
}

2 个答案:

答案 0 :(得分:1)

假设你有一个标签可以做到这一点 好吧。
假设您也使用MVVM模式 确定。

ViewController有标签,&#34;观察&#34; (*) ViewModel属性&#39;进度&#39;
ViewModel拥有属性&#39;进展&#39;

class ViewModel: NSObject {

  dynamic var progress: Int = 0

  func save(object object: Object) {
      do {
          let realm = try Realm()
          try realm.write({ () -> Void in
              // Here your operations on DB 
              self.progress += 1
          })
      } catch let error as NSError {
          ERLog(what: error)
      }
  }
}

这样,当&#34;进展&#34;时,会通知viewController。更改,您可以更新UI。

你的VC应该有这样的方法,例如viewDidLoad调用:

private func setupObservers() {
   RACObserve(self.viewModel, keyPath: "progress").subscribeNext { (next: AnyObject!) -> Void in
     if let newProgress = next as? Int {
        // Here update label            
     }
   }
}

RACObserve是一个全局函数:

import Foundation
import ReactiveCocoa

func RACObserve(target: NSObject!, keyPath: String) -> RACSignal  {
    return target.rac_valuesForKeyPath(keyPath, observer: target)
}

(*)例如,您可以使用ReactiveCocoa

答案 1 :(得分:1)

来自Realm的Katsumi。首先,Realm无法知道数据的总量。因此,计算进度并通知它应该在您的代码中完成。

总计是结果数组的计数。将count存储为本地变量。然后定义progress变量来存储持久化的数量。每次将对象保存到Realm时,都应增加progress。然后通知进度。

let count = results.count // Store count of results
if count > 0{
    if let users = results.array {
        let progress = 0 // Number of persisted

        let realm = try! Realm()
        try realm.write {
            for user in users{
                let userList=UserList()
                [...]
                realm.add(userList,update: true)

                progress += 1 // After save, increment progress
                notify(progress, total: count)
            }
        }
    }
}

因此有几种方法可以通知进度。我们在这里使用NSNotificationCenter例如:

func notify(progress: Int, total: Int) {
    NSNotificationCenter
        .defaultCenter()
        .postNotificationName("ProgressNotification", object: self, userInfo: ["progress": progress, "total": total])
}