好的,所以我在为云交互编写体面的测试时遇到了麻烦。我有一个项目(航程)获得了一个记录在云中进行测试的项目,该项目通过引用获得参与者(参与者也拥有自己的记录(crewMember))。现在在测试后的拆解过程中我删除了航程,并期望删除crewMember记录(引用是.DeleteSelf),但这种情况从未发生过。
我现在在方法结束时手动调用delete(使用dispatch_group等待),但在等待结束后仍然在数据库中(导致测试在下次运行时失败)。如果下面的代码不够,我可以添加更多或链接到Github。我的问题是为什么派遣小组没有成功从云中删除,为什么派对成员的记录没有被任何一种方法删除(参考中的.DeleteSelf或大多数其他实例中的'deleteRecordable')? 。
至于错误,我似乎得到了很多'记录改变'错误,虽然我不确定它是否特别是由这个事务生成,我不知道为什么会停止删除(为什么会如果记录改变了,那也很重要;但是在我开始删除它之后它又是如何改变的?)。
我在测试结束时添加了这个:
// Remove record for additional tests.
let group = dispatch_group_create()
dispatch_group_enter(group)
crewMember.deleteFromCloud(database) {
print("leaving dispatch group...")
dispatch_group_leave(group) }
dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
并且deleteFromCloud
函数如下所示:
/*
* This method removes the instance conforming to Recordable from the cloud. Any preparation
* or follow up required by an instance needs to be handled here. If possible use generic
* function from CloudInteractor for implementation.
*/
func deleteFromCloud(database: CKDatabase, completionHandler: (() -> ())? = nil) {
let cloud = CloudInteractor()
cloud.deleteRecordable(self, database: database, completionHandler: completionHandler)
}
deleteRecordable
(在其他几个实例中似乎工作得很好)看起来像这样:
/**
* This method deletes any instance that conforms to recordable from the cloud. Has no checks or constraints
* before attempting removal.
*/
func deleteRecordable<T: Recordable>
(instanceConformingToRecordable: T, database: CKDatabase, completionHandler: (() -> ())? = nil) {
let recordID = instanceConformingToRecordable.recordID
print("deleting \(recordID)") // <-- NOT SKIPPED
database.deleteRecordWithID(recordID) { recordID, error in
print("deletion concluding...") // <-- !! SKIPPED !!
guard error == nil else {
print("d!snap") // <-- !! SKIPPED !!
self.tempHandler = self.deleteRecordable(instanceConformingToRecordable,
database: database,
completionHandler: completionHandler)
print("d!crackle :\(self.tempHandler)") // <-- !! SKIPPED !!
CloudErrorHandling.handleError(error!, errorMethodSelector: #selector(self.runTempHandler))
print("d!pop") // <-- !! SKIPPED !!
return
}
print("deletion had no errors: \(recordID)") // <-- Never reached...
if let handler = completionHandler { handler() }
}
}