【发布时间】:2016-10-09 10:41:22
【问题描述】:
我有一个模型,它是一个 swift 对象。
我从网络上检索数据,然后我需要更新我的对象,但有不同的情况需要处理:
- 我创建一个对象,获取数据,更新属性,将其保存在领域中
- 我创建了一个对象,将其保存在领域中,获取数据,更新属性,再次保存
- 我创建了一个对象,将其保存在领域中,开始获取数据,从领域中删除它,接收数据,什么都不做。
这就是我的处理方式:
如果 self.invalidated == false & self.realm == nil -> 更新 self 上的属性
If self.invalidated == false & self.realm != nil -> 在后台线程中从 Realm 获取对象,设置属性,在完成前在主线程上刷新 Realm
如果 self.invalidated == true -> 停止(对象已被删除,因此不再需要)
简化此代码的一种解决方案是将对象保存在领域中,但我不想保存可能比领域中的潜在对象更脏的对象。或者我可以在在线获取数据之前获取我在领域中拥有的任何东西,这样我确信我保存的东西至少与领域中的一样脏(但性能并不像它可能的那样最佳)
您能否告诉我处理这种情况的最干净的方法是什么?
这是我目前的代码:
func fetchDataOnline(completion:(success : Bool)->()){
let params = ["tmdb_id":self.tmdbId,"lang":kLang]
let tmdbId = self.tmdbId
let invoker = AWSLambdaInvoker.defaultLambdaInvoker()
invoker.invokeFunction("getMovie", JSONObject: params).continueWithBlock { (task) -> AnyObject? in
guard self.invalidated == false else{
DDLogWarn("Movie has been invalidated while fecthing data")
completion(success: false)
return nil
}
if let dic = task.result as? NSDictionary{
var objectToUpdate = self
if self.realm != nil{ //Use new realm instance
guard let newRealmInstance = try! Realm().objectForPrimaryKey(MovieNew.self, key: tmdbId) else{
DDLogError("self.realm not nil but can't find movie in realm")
completion(success: false)
return nil
}
objectToUpdate = newRealmInstance
}
try! Realm().write{
objectToUpdate.setProperties(dic: dic)
objectToUpdate.lastUpdate = NSDate()
}
}
else{ //No dictionary found from result
if let error = task.error{
DDLogError(error.description)
}
DDLogError("Error getting movie")
}
Async.main{
try! Realm().refresh()
completion(success : task.error == nil)
}
return nil
}
}
【问题讨论】: