首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cloudkit回调系列--何时弹出到以前的控制器

cloudkit回调系列--何时弹出到以前的控制器
EN

Stack Overflow用户
提问于 2020-01-07 04:26:51
回答 1查看 26关注 0票数 0

我有一系列连续的云工具包调用来获取记录,每个调用都是基于以前的fetch。这些获取中的任何一个都可能失败,然后我必须切换到以前的控制器。由于获取失败的地方太多,我不得不在许多位置将popViewController嵌入到以前的控制器中。如果可能的话,我可以避免这种情况,只打一次电话吗?

代码语言:javascript
复制
 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)
            }
        }

    })

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-09 19:28:07

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

这里有一个建议,通过使您的主要功能有一个闭包,将错误处理和弹出合并到一个地方:

代码语言:javascript
复制
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)
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59622162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档