领域最佳实践:如何处理异步HTTP对象更新?

时间:2016-10-09 10:41:23

标签: ios swift realm

我有一个快速反对的模型。

我从网上检索数据,然后我需要更新我的对象,但有不同的情况来处理:

  1. 我创建一个对象,获取数据,更新属性,将其保存在领域
  2. 我创建一个对象,将其保存在领域,获取数据,更新属性,再次保存
  3. 我创建了一个对象,将其保存在领域,开始获取数据,从领域中删除它,接收数据,什么都不做。
  4. 这就是我处理它的方式:

    1. 如果self.invalidated == false& self.realm == nil - >更新自己的属性

    2. 如果self.invalidated == false& self.realm!= nil - >在后台线程中从Realm获取对象,在完成之前设置属性,在主线程上刷新Realm

    3. 如果self.invalidated == true - >停止(对象已被删除,因此不再需要它)

    4. 简化此代码的一个解决方案是将对象保存在领域中,但我不想保存可能比领域中的潜在对象更脏的对象。或者我可以在网上获取数据之前获取我所拥有的任何东西,这样我就可以确保我保存的东西至少和领域中的东西一样肮脏(但性能并不像它那样最佳)

      你能否给我一些见解,处理这种情况的最简洁方法是什么?

      此处是我的代码:

      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
          }
      }
      

1 个答案:

答案 0 :(得分:1)

鉴于您的特定用例场景,我认为这似乎是最好的方法。虽然你可以在Realm对象中自己进行状态跟踪,但是简单地跟踪它们的父Realm对象的状态并相应地响应它会更好。

Realm的主要最佳实践主要是尝试尽可能减少写入事务的数量。所以我唯一可能在这里提出的问题是,在执行之前是否绝对有必要向Realm添加一个对象请求,只能在下载完成之前再次删除它。如果这是必要的,因为你在UI中使用这些对象作为占位符,那就完全没问题了。

无论哪种方式,所有这些都是一个意见问题。你提出的这个解决方案很有能力并满足你的所有要求,所以我不确定是否值得尝试找到更好的东西。 :)