我有一系列连续的云工具包调用来获取记录,每个调用都是基于以前的fetch。这些获取中的任何一个都可能失败,然后我必须切换到以前的控制器。由于获取失败的地方太多,我不得不在许多位置将popViewController嵌入到以前的控制器中。如果可能的话,我可以避免这种情况,只打一次电话吗?
func iCloudSaveMeterHubPrivateDbCz() {
self.clOps.iCloudFetchRecord(recordName: locId, databaseScope: CKDatabaseScope.private, customZone: true, completion: { (locationRecord, error) in
guard error == nil else {
self.navigationController!.popViewController(animated: true)
return
}
self.iCloudFetchMeter(withLocationCKRecord: locationRecord!) { records, error in
if (error != nil ) {
if let ckerror = error as? CKError {
self.aErrorHandler.handleCkError(ckerror: ckerror)
}
self.navigationController!.popViewController(animated: true)
}
if let _ = records?.first {
self.clOps.iCloudFetchRecord(recordName: contactId, databaseScope: CKDatabaseScope.private, customZone: true, completion: { (contactRecord, error) in
if let ckerror = error as? CKError {
self.aErrorHandler.handleCkError(ckerror: ckerror)
self.navigationController!.popViewController(animated: true)
}
DispatchQueue.main.async {
if let record = contactRecord {
record.setObject("true" as NSString, forKey:"assignedEEP")
}
}
}
self.navigationController!.popViewController(animated: true)
}
}
})
}发布于 2020-01-09 19:28:07
每当我进入像这样的嵌套回调时,我都会尝试合并处理对代码中单个点的响应。在这种情况下,编码器的流行座右铭是:“不要重复自己”。
这里有一个建议,通过使您的主要功能有一个闭包,将错误处理和弹出合并到一个地方:
func iCloudSaveMeter(finished: @escaping (_ success: Bool, _ error: CKError?) -> Void){
self.clOps.iCloudFetchRecord(recordName: locId, databaseScope: CKDatabaseScope.private, customZone: true, completion: { (locationRecord, error) in
if error != nil {
//:::
finished(false, error)
}
self.iCloudFetchMeter(withLocationCKRecord: locationRecord!) { records, error in
if error != nil {
//:::
finished(false, error)
}
if let _ = records?.first {
self.clOps.iCloudFetchRecord(recordName: contactId, databaseScope: CKDatabaseScope.private, customZone: true, completion: { contactRecord, error in
//:::
finished(false, error)
DispatchQueue.main.async {
if let record = contactRecord {
record.setObject("true" as NSString, forKey:"assignedEEP")
}
}
}
}
//:::
finished(true, nil)
}
})
}
//----
//Call it like this
iCloudSaveMeter(){ success, error in
//Pop
if !success{
self.navigationController!.popViewController(animated: true)
}
//Hande error
if let error = error{
self.aErrorHandler.handleCkError(ckerror: error)
}
}https://stackoverflow.com/questions/59622162
复制相似问题