将数据插入领域数据库并取得进展?

Posted

技术标签:

【中文标题】将数据插入领域数据库并取得进展?【英文标题】:Inserting data into realm DB with progress? 【发布时间】:2016-03-16 08:32:16 【问题描述】:

下载json字符串后,我有大约7MB的请求数据,这意味着json字符串大约为7MB。下载后,我想将数据保存到领域模型对象(表)中,进度如下

(1/7390) 到 (7390/7390) ->(插入的数据/要插入的总数据)

我在我的应用程序中使用 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

【问题讨论】:

您是要自己记录(1/7390)到(7390/7390)还是要在界面中显示给用户? 我想在插入时显示用户(该字段将增加/总记录) 【参考方案1】:

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

ViewController 具有标签并“观察”(*) ViewModel 属性“进度” ViewModel 具有属性“进度”

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)
      
  

通过这种方式,当“进度”发生变化时会通知 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。

【讨论】:

好的,我试一试,如果成功,我会给出真实的答案。谢谢先生,您的帮助 嗯,我是刚改用 Swift 的 java 开发人员。所以,我不知道任何客观的 -C 代码。所以,如果你不介意的话,有任何示例应用程序可以帮助我吗?还对它所做的步骤进行了一些评论。 self.viewModel 说“无法将 ViewModel 类型的值转换为预期的参数类型 NSObject ”。请帮忙?任何细节表示赞赏 我的错,我错过了 ViewModel 需要从 NSObject 继承,检查更新 我还是听不懂,我的意思是没有出现进度。;(。如果可以的话,我想通过邮件与你交谈。因为我想在那里分享我的代码。跨度> 【参考方案2】:

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

总计是结果数组的计数。将count 存储为局部变量。然后定义progress变量来存储持久化的数量。 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])

【讨论】:

谢谢,我试试看。 :D

以上是关于将数据插入领域数据库并取得进展?的主要内容,如果未能解决你的问题,请参考以下文章

何恺明等在图像识别任务上取得重大进展,这次用的是弱监督学习

盘点 2017 年深度学习 NLP 重磅技术

边缘计算技术取得进展 但障碍依然存在

Swift:PhotoLibrary 删除资产并取得进展

深度学习在图像识别中的研究进展与展望

王晓刚深度学习在图像识别中的研究进展与展望