【问题标题】: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 答案,似乎是一个相关问题: stackoverflow.com/a/24035639/250164

标签: ios swift


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多