为什么 Parse-server 中的删除不需要事先获取该对象?
Why doesn't Deletion in Parse-server require to obtain that object beforehand?
我遇到了一个奇怪的行为。尽管我的单元测试通过了,但我不太明白这一点。
func testDeleteMoment() {
// Create a Moment for current user
let expectCreate = expectation(description: "create moment should succeed")
Datastore.shared.createMoment(notes: "myNotes", rating: 1, time: Date(), location: "", isPublic: true, completion: {(success, error) in
XCTAssertTrue(success)
expectCreate.fulfill()
})
waitForExpectations(timeout: 5) { (error) in
XCTAssertNil(error, "Test timed out. \(String(describing: error?.localizedDescription))")
}
let query = PFQuery(className: "Moment")
var objectId = ""
do {
query.whereKey("owner", equalTo:PFUser.current()!)
let object = try query.getFirstObject()
objectId = object.objectId!
} catch {}
let task = Datastore.shared.deleteMoment(id: objectId)
task.waitUntilFinished()
let query2 = PFQuery(className: "Moment")
query2.whereKey("owner", equalTo:PFUser.current()!)
let task3 = query2.countObjectsInBackground()
task3.waitUntilFinished()
XCTAssertEqual(task3.result, 0)
}
在编写 datastore.deleteMoment()
时,我注意到与 saveEventually()
不同,deleteEventually()
没有完成处理程序。相反,它只带有一个 BFTask<NSNumber>
。因此,我尝试了以下代码,令我惊讶的是单元测试通过了。
func deleteMoment(id: String) -> BFTask<NSNumber> {
let pfMoment = PFObject(className:"Moment")
pfMoment.objectId = id
return pfMoment.deleteEventually()
}
为什么我不必事先检索对象来删除它?为什么没有一个通过 id 删除对象的方法,而不是像这样呢?
How comes that I don't have to retrieve the object before hand in order to delete it?
Parse 让您可以使用 "shell objects"。基本上,如果您知道对象 ID,您可以将它附加到一个解析对象 subclass 的空白实例,并对其执行 some 操作。您可以创建一个 shell,分配几个值,然后调用 object.save()
,它将只更新那些字段。您可以创建一个空白对象,分配一个 id,然后调用 object.fetch()
来获取它,而不必从另一个对象的查询或指针中获取该对象。
之所以有效,是因为为了执行数据库操作,对象 ID 和 class 名称是唯一需要的信息。如果您只想更新几个字段,则不需要提取所有其余数据来执行此操作。如果你想销毁一个对象,为什么你首先需要本地的所有数据?您只需要删除数据库中具有匹配 _id 的条目。
Why isn't there then just a method to delete the object via an id, instead of doing it like this?
还没有人建造它。 Parse 是开源的,虽然它在今天是一个非常了不起的资源,但肯定还有很大的改进空间。随意添加此功能并创建 PR。虽然您可以通过使用此函数扩展 Parse.Object class 来轻松构建自己的包装器,但这基本上可以完成您已经在幕后所做的事情。
我遇到了一个奇怪的行为。尽管我的单元测试通过了,但我不太明白这一点。
func testDeleteMoment() {
// Create a Moment for current user
let expectCreate = expectation(description: "create moment should succeed")
Datastore.shared.createMoment(notes: "myNotes", rating: 1, time: Date(), location: "", isPublic: true, completion: {(success, error) in
XCTAssertTrue(success)
expectCreate.fulfill()
})
waitForExpectations(timeout: 5) { (error) in
XCTAssertNil(error, "Test timed out. \(String(describing: error?.localizedDescription))")
}
let query = PFQuery(className: "Moment")
var objectId = ""
do {
query.whereKey("owner", equalTo:PFUser.current()!)
let object = try query.getFirstObject()
objectId = object.objectId!
} catch {}
let task = Datastore.shared.deleteMoment(id: objectId)
task.waitUntilFinished()
let query2 = PFQuery(className: "Moment")
query2.whereKey("owner", equalTo:PFUser.current()!)
let task3 = query2.countObjectsInBackground()
task3.waitUntilFinished()
XCTAssertEqual(task3.result, 0)
}
在编写 datastore.deleteMoment()
时,我注意到与 saveEventually()
不同,deleteEventually()
没有完成处理程序。相反,它只带有一个 BFTask<NSNumber>
。因此,我尝试了以下代码,令我惊讶的是单元测试通过了。
func deleteMoment(id: String) -> BFTask<NSNumber> {
let pfMoment = PFObject(className:"Moment")
pfMoment.objectId = id
return pfMoment.deleteEventually()
}
为什么我不必事先检索对象来删除它?为什么没有一个通过 id 删除对象的方法,而不是像这样呢?
How comes that I don't have to retrieve the object before hand in order to delete it?
Parse 让您可以使用 "shell objects"。基本上,如果您知道对象 ID,您可以将它附加到一个解析对象 subclass 的空白实例,并对其执行 some 操作。您可以创建一个 shell,分配几个值,然后调用 object.save()
,它将只更新那些字段。您可以创建一个空白对象,分配一个 id,然后调用 object.fetch()
来获取它,而不必从另一个对象的查询或指针中获取该对象。
之所以有效,是因为为了执行数据库操作,对象 ID 和 class 名称是唯一需要的信息。如果您只想更新几个字段,则不需要提取所有其余数据来执行此操作。如果你想销毁一个对象,为什么你首先需要本地的所有数据?您只需要删除数据库中具有匹配 _id 的条目。
Why isn't there then just a method to delete the object via an id, instead of doing it like this?
还没有人建造它。 Parse 是开源的,虽然它在今天是一个非常了不起的资源,但肯定还有很大的改进空间。随意添加此功能并创建 PR。虽然您可以通过使用此函数扩展 Parse.Object class 来轻松构建自己的包装器,但这基本上可以完成您已经在幕后所做的事情。