iOS Swift下Parse本地数据存储离线时unpin操作失效问题
问题原因
这是Parse iOS SDK 19.0.0版本的已知非预期行为,和saveEventually的本地任务队列机制直接相关:
- 调用
saveEventually后,SDK会将对象的变更任务暂存到本地离线队列,队列中的对象会被SDK自动标记为「待同步」,默认会额外隐式pin到系统级本地存储分区,优先级高于用户主动调用的unpin操作 - 离线状态下队列任务未执行完成,哪怕显式调用
unpinInBackground,SDK为了避免同步任务丢失,不会将隐式pin的对象从本地移除,所以查询本地存储时依然能拿到对应对象 - 联网后队列任务执行完成,隐式pin自动解除,本地数据就会和操作结果对齐
修复方案
按以下逻辑调整代码即可解决问题:
- 无需移除
deleteEventually调用,只需将unpin操作放到deleteEventually的回调中执行
newTest.deleteEventually { success, error in guard success, error == nil else { return } // 标记待删除任务入队完成后再执行unpin newTest.unpinInBackground() }
- 如果要在离线状态下立刻让对象不出现在本地查询结果中,可以在查询时添加过滤条件,排除标记为待删除的对象:
let query = PFQuery(className: "Test") query.fromLocalDatastore() // 过滤待删除的对象 query.whereKeyExists("objectId") query.whereKey("isDeleted", equalTo: NSNumber(value: false)) query.findObjectsInBackground { (objects, error) in if let objects = objects { print(objects) } }
- 也可以直接升级到Parse iOS SDK 19.2.0及以上版本,该版本已经修复了离线状态下隐式pin优先级高于显式unpin的问题。
验证说明
你遇到的「unpin返回成功但对象仍存在」不是业务代码逻辑问题,完全是SDK内部隐式pin机制导致的。全程联网的情况下saveEventually和deleteEventually会立刻执行完成,隐式pin同步解除,所以不会复现问题。
内容的提问来源于stack exchange,提问作者robotos
相关产品推荐
相关产品推荐

