【问题标题】:Realm best practices: How to handle asynchronous HTTP object update?Realm 最佳实践:如何处理异步 HTTP 对象更新?
【发布时间】:2016-10-09 10:41:22
【问题描述】:

我有一个模型,它是一个 swift 对象。

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

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

这就是我的处理方式:

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

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

  3. 如果 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
    }
}

【问题讨论】:

    标签: ios swift realm


    【解决方案1】:

    鉴于您的特定用例场景,我认为这看起来是最好的方法。虽然您可以在 Realm 对象本身内进行状态跟踪,但最好简单地根据其父 Realm 对象跟踪它们的状态并相应地做出响应。

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

    不管怎样,这一切都是见仁见智。您提出的这个解决方案很称职,可以满足您的所有要求,所以我不确定是否值得尝试找到更好的解决方案。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 2017-05-11
      • 2013-05-09
      • 2011-11-10
      • 1970-01-01
      • 2013-04-22
      相关资源
      最近更新 更多