一系列的Cloudkit回调-何时跳至上一个控制器

我有一系列顺序的云工具包调用,以分别基于先前的获取来获取记录。这些提取中的任何一个都可能失败,然后我必须跳到上一个控制器。由于存在很多提取失败的地方,因此我必须在许多位置将popViewController嵌入到以前的控制器中。我可以避免这种情况,并在可能的情况下仅调用一次popover吗?

 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,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)
            }
        }

    })

}
zhihao222 回答:一系列的Cloudkit回调-何时跳至上一个控制器

每当我进入这样的嵌套回调时,我都会尝试合并处理对代码中单个点的响应。在这种情况下,流行的编码员座右铭会有所帮助:“不要重复自己”

这里建议通过使主函数具有闭包来合并错误处理并弹出到单个位置:

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,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://www.f2er.com/2811681.html

大家都在问