Діма Комар
Діма Комар

Reputation: 552

Realm update results in database from server

I want to sync my data with json api, but when im making request second time(im editing data on a server side), data in ream is still old, are there any way to sync both server and realm db

my shema in realm :

  class testObject: Object {

    dynamic var id: Int = 0
    dynamic var name: String = ""
    dynamic var url: String = ""

    override static func primaryKey() -> String? {
        return "id" 
  }
}

Request:

func request() {

        let url = NSURL(string: "http://localhost:3000/products.json")
        let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {  (data, response, error) in

            if error != nil {
                print("error != nil")
                print(error)
            } else {

                var jsonData = try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
                 // Crashes on this line

                do {
                    let realm = try Realm()
                    try! realm.write({ () -> Void in
                        for info in jsonData {
                            let user = Mapper<testObject>().toJSON
                            realm.create(testObject.self, value: info, update: true)

                        }
                    })

                } catch let error as NSError {
                    print(error)
                }



            }
        }


        task.resume()


    }

in my UITableViewController im calling in viewDidLoad():

func reloadMyTable() {

        do {
            let realm = try Realm()
            self.datasource = realm.objects(testObject)
            self.myTableView.reloadData()
        } catch let error as NSError {
            print(error)
        }

    }

notificationToken: enter image description here

Upvotes: 1

Views: 806

Answers (1)

marius
marius

Reputation: 7806

This looks like you trigger an asynchronous network request and are loading your UITableViewController concurrently. So the new data seems to be not loaded yet, while you're trying to render the results.

To achieve that you can listen to write notifications on the Realm.

var notificationToken: NotificationToken?

override func viewDidLoad() {
    super.viewDidLoad()

    let realm = try! Realm()
    self.datasource = realm.objects(testObject) // is auto-updated

    notificationToken = realm.addNotificationBlock { note, realm in
       self.myTableView.reloadData()
    }
}

deinit {
    if let notificationToken = notificationToken {
        let realm = try! Realm()
        realm.removeNotification(notificationToken)
    }
}

Upvotes: 1

Related Questions