Reputation: 552
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)
}
}
Upvotes: 1
Views: 806
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