使用云套件进行测试:无法删除测试记录

时间:2016-08-19 22:08:51

标签: swift grand-central-dispatch icloud

好的,所以我在为云交互编写体面的测试时遇到了麻烦。我有一个项目(航程)获得了一个记录在云中进行测试的项目,该项目通过引用获得参与者(参与者也拥有自己的记录(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() }
    }
}

0 个答案:

没有答案