为什么 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 来轻松构建自己的包装器,但这基本上可以完成您已经在幕后所做的事情。