Ожидание завершения двух разных вызовов REST / Network - PullRequest
0 голосов
/ 06 июня 2018

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

Дождаться окончания выполнения цикла swift for с асинхронными сетевыми запросами

Ожидание завершения задания

//let loader = from Oauth2/p2_OAuth2 pod to load JSON
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)
                }
            }
            self.dexRequestType = DexRequestTypesEnum.glucoseValues
            //ignore last line.  should be removed.
            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()
            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”)
             }

        }

    }

1 Ответ

0 голосов
/ 06 июня 2018

Вы должны использовать

dg.enter () перед вызовом Задача

dg.leave () после завершения задачи

Например:

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()
        }
        self.dexRequestType = DexRequestTypesEnum.glucoseValues

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

        group.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”)
         }

    }

}
...