Ios 使用Cloudkit进行嵌套异步获取?

Ios 使用Cloudkit进行嵌套异步获取?,ios,swift,cloudkit,Ios,Swift,Cloudkit,我对iOS的编码比较陌生。在过去的一周里,我一直在将CloudKit整合到我的项目中。我想做的一件事是获取当前用户recordID。然后,使用该recordID,我想获取该用户的实际记录。目前,我正在使用以下代码,这似乎是可行的: self.container.fetchUserRecordID() { recordID, error in if error == nil { self.userRecordID = recordID

我对iOS的编码比较陌生。在过去的一周里,我一直在将CloudKit整合到我的项目中。我想做的一件事是获取当前用户recordID。然后,使用该recordID,我想获取该用户的实际记录。目前,我正在使用以下代码,这似乎是可行的:

self.container.fetchUserRecordID() { recordID, error  in
        if error == nil {
            self.userRecordID = recordID
            DispatchQueue.main.async(execute: {
                self.db.fetch(withRecordID: self.userRecordID) { record, error in
                    if error == nil {
                        self.userRecord = record
                    } else {
                        if let error = error as? CKError {
                            print(error)
                        }
                    }
                }
            })
        }
        else {
            if let error = error as? CKError {
                print(error)
            }
        }
    }
然而,我觉得这很混乱。我的问题有两个:1)一般来说,嵌套异步调用可以接受吗?2) 如果没有,在这种情况下,有没有更好的方法来完成我想做的事情


谢谢

嵌套异步调用很好。如果呼叫b在呼叫a结束之前无法完成,那么就没有更好的方法了。在代码中,如果对self.container.fetchUserRecordID的调用已经在后台线程中运行,那么就不需要DispatchQueue包装器。谢谢!我想我明白你的意思;那么你是说,为什么不在fetchUserRecordID相同的线程中执行fetch(withRecordID:)呢?实际上我刚刚注意到它是DispatchQueue.main,不知怎的,我把它读作DispatchQueue.global。如果需要在主队列中运行,可以在DispatchQueue.main中封装某些内容。GUI代码需要在主队列中运行,因此如果UI正在更新,它必须进入主队列,在您的情况下,我假定没有UI正在更新,因此不仅没有必要,而且应该积极避免,因为任何可能长时间运行的活动都不应该在主线程中执行。很酷,谢谢!这是有道理的!