发出调用快速完成处理程序关闭的问题

Posted

技术标签:

【中文标题】发出调用快速完成处理程序关闭的问题【英文标题】:Issue calling swift completion handler closure 【发布时间】:2014-07-04 10:42:47 【问题描述】:

我有一个将闭包作为完成处理程序的函数。它反过来调用一个也接受一个函数的函数。完成后,我想从第一个完成闭包中获取返回值并调用第二个完成闭包。

func saveUserToCloud(user: MBUser, completionHandler: (CKRecord, NSError) -> Void) 
    let userRecord = CKRecord(recordType: kMBUser)
    userRecord.setObject(user.nickname, forKey: kMBUserNickname)
    self.publicDb.saveRecord(userRecord, completionHandler: record, error in completionHandler(record, error))
    

这个函数抛出异常:

致命错误:无法打开 Optional.None

func saveUserToCloud(user: MBUser, completionHandler: (CKRecord, NSError) -> Void) 
    let userRecord = CKRecord(recordType: kMBUser)
    userRecord.setObject(user.nickname, forKey: kMBUserNickname)
    // this line throws the exception:
    self.publicDb.saveRecord(userRecord, completionHandler: record, error in completionHandler(record, error))
    

我做错了什么?我有记录,在这种情况下没有错误。我想它正在尝试解开错误?

谢谢

【问题讨论】:

user不是调用中的可选值吗?我会检查 user 对象在状态上是否正确。 编辑: 也许也检查这个 SO 答案,似乎是一个相关问题: ***.com/a/24035639/250164 【参考方案1】:

您的昵称属性可能是 MBUser 对象中的可选属性。您可以将其设为非可选,或者如果您知道它已在此函数中设置,请使用以下命令强制执行:

userRecord.setObject(user.nickname!, forKey: kMBUserNickname)

如果昵称是 nil 那么你会在这里得到错误 我不认为问题出在你的completionHandler

【讨论】:

以上是关于发出调用快速完成处理程序关闭的问题的主要内容,如果未能解决你的问题,请参考以下文章

flutter_bloc(在事件处理程序正常完成后调用发出

从另一个文件中快速调用完成处理程序失败

未调用dismissViewController 完成处理程序

没有为 ASWebAuthenticationSession 调用会话完成处理程序

是否通过链调用 ASIO 完成处理程序以取消操作?

COM 是不是提供延迟关闭直到所有 RPC 完成的方法?