серия обратных вызовов cloudkit - когда переходить на предыдущий контроллер - PullRequest
0 голосов
/ 07 января 2020

У меня есть серия последовательных вызовов облачного набора для получения записей, каждая из которых основана на предыдущей выборке. Любая из этих выборок может потерпеть неудачу, и тогда мне придется перейти на предыдущий контроллер. Так как выборки могут провалиться так много раз, я должен встроить 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, 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)
            }
        }

    })

}

1 Ответ

0 голосов
/ 09 января 2020

Всякий раз, когда я сталкиваюсь с такими вложенными обратными вызовами, я пытаюсь объединить обработку ответа на одну точку в коде. В этом случае помогает популярный девиз кодеров: "не повторяйся"

Вот предложение для консолидации обработки ошибок и обращения к одному месту, если у вашей основной функции есть замыкание :

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...