首页 文章

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

提问于
浏览
2

我有一个模型,这是一个快速的对象 .

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

  • 我创建一个对象,获取数据,更新属性,将其保存在领域

  • 我创建了一个对象,将其保存在领域,获取数据,更新属性,再次保存

  • 我创建了一个对象,将其保存在领域,开始获取数据,从领域中删除它,接收数据,什么也不做 .

And this is how I handle it:

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

  • 如果self.invalidated == false&self.realm!= nil - >在后台线程中从Realm获取对象,请在完成之前设置主线程上的属性Refresh 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
    }
}

1 回答

  • 1

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

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

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

相关问题