Ожидание завершения задачи из другого объекта (класса)

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

Он построен на этом вопросе: Ожидание двух разных REST/Network звонки для завершения

class ConnectionAPI
{
func getABStructWrapper() -> ABStructWrapper
{
    ConnectionHandler()
    return self.structWrapper
}

//let loader = from Oauth2/p2_OAuth2 pod to load JSON
//other general func and var’s 
func ConnectionHandler()
{

    let dg = DispatchGroup()

    switch self.RequestType
    {
    case aRequest:
        //if I make a single call here, works fine 
    case bRequest:
        //if I make a single call here, works fine 
    case abRequest:
        //when making requests for both type a and b, can’t get it to work
        dg.enter()

        loader.perform(request: self.userDataRequest)
        { response in
            do
            {
                let json = try response.responseJSON()
                self.structWrapper.aArray = self.loadAArray(dict: json)
            }
            catch let error {
                self.didCancelOrFail(error)
            }

           dg.leave()
        }

        dg.enter()

        loader.perform(request: self.userDataRequest)
        { response in
            do
            {
                let json = try response.responseJSON()
                self.structWrapper.bArray = self.loadBArray(dict: json)                }
            catch let error {
                self.didCancelOrFail(error)
            }

          dg.leave()
        }

       //This works! but want to do this from a view
       //commented out in xcode:
        dg.notify(queue: .main) 
        {

          for x in self.structWrapper.aArray                  
           {
             print(x.displayTime + ":" + x.units)
           }
           for y in self.structWrapper.bArray
           {
            print(y.displayTime + ":" + String(y.someNumber) 
           }
            print(“tasks complete”)
         }

    }

}
}

С моей точки зрения:

Func getValues
{

        let dg = DispatchGroup()
        dg.enter()
        self.StructWrapper = ConnectionAPI.getABStructWrapper()
        dg.leave()
        dg.notify(queue: .main) 
       {
            //will print, but requests are not complete, arrays are empty, even though breakpoints hit in loading them.
          for x in self.structWrapper.aArray                  
           {
             print(x.displayTime + ":" + x.units)
           }
           for y in self.structWrapper.bArray
           {
            print(y.displayTime + ":" + String(y.someNumber) 
           }
            print(“tasks complete”)
        }
}

person BriOnH    schedule 06.06.2018    source источник


Ответы (1)


В классе запросов вам нужен обработчик завершения

class ConnectionAPI {

   static let shared = ConnectionAPI()

   func ConnectionHandler(completion:@escaping(_ finished:Bool)->void) {

      //
      //

     dg.notify(queue: .main) {

       completion(true)
     }

   }

}

Примечание, вам необходимо обрабатывать случаи ошибок и отправлять

completion(false)

//

Вам не нужны никакие DispatchGroup в представлении, поскольку вы уже сделали это в сетевом классе.

func getValues() {
     ConnectionAPI.shared.ConnectionHandler {  (finished) in

       if finished {
          print(ConnectionAPI.shared.aArray)
       }
     }
  }
person Sh_Khan    schedule 06.06.2018