iOS 共享扩展中的 Firebase runTransactionBlock()

Firebase runTransactionBlock() in iOS share extension

我的共享扩展包含以下代码作为 didSelectPost() 部分的一部分:

override func didSelectPost() {
    if self.sharedURL != nil {
            // Send data to Firebase
            self.myRootRef.runTransactionBlock({
                (currentData:FMutableData!) in
                var value = currentData.value as? String
                // Getting the current value
                // and checking whether it's null
                if value == nil {
                    value = ""
                }
                // Setting the new value to the clipboard
                // content
                currentData.value = self.sharedURL?.absoluteString

                // Finalizing the transaction
                return FTransactionResult.successWithValue(currentData)
                }, andCompletionBlock: {
                    // Completion Check
                    (error:NSError!, success:Bool, data:FDataSnapshot!) in
                    print("DEBUG- We're done:\(success) and \(error)")
                }
            )
        }

        // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments.
        // Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context.
        self.extensionContext!.completeRequestReturningItems([], completionHandler: nil)
}

我在运行时遇到以下错误:

host connection <NSXPCConnection: 0x7fb84af2e8c0> connection from pid 16743 invalidated

我认为此错误是由 andCompletionBlock 引起的,并且与以下问题有关:Debug info when run today extension

如何干净利落地处理上述交易的完成状态?

正如您链接到的答案所述,NSXPCConnection 错误在这里无关紧要。

问题是 .runTransactionBlock() 是异步的,在您从 Firebase 数据库中获取值之前,.completeRequestReturningItems() 将被调用并退出扩展。

andCompletionBlock.

中尝试 运行 .completeRequestReturningItems()
override func didSelectPost() {
    if self.sharedURL != nil {
            // Send data to Firebase
            self.myRootRef.runTransactionBlock({
                (currentData:FMutableData!) in
                var value = currentData.value as? String
                // Getting the current value
                // and checking whether it's null
                if value == nil {
                    value = ""
                }
                // Setting the new value to the clipboard
                // content
                currentData.value = self.sharedURL?.absoluteString

                // Finalizing the transaction
                return FTransactionResult.successWithValue(currentData)
                }, andCompletionBlock: {
                    // Completion Check
                    (error:NSError!, success:Bool, data:FDataSnapshot!) in
                            self.extensionContext!.completeRequestReturningItems([], completionHandler: nil)
                }
            )
        }

}