Swift - получить результаты от обработчика завершения

У меня есть этот метод, который находится внутри класса с именем WebService, внутри этого метода я получаю данные из API:

func GetTableDataOfPhase(phase: String, completion: (result: AnyObject) -> Void)
    {
        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)

        let requestString = NSString(format:"%@?jobNo=%@", webservice, phase) as String
        let url: NSURL! = NSURL(string: requestString)

        let task = session.dataTaskWithURL(url, completionHandler: {
            data, response, error in

            dispatch_async(dispatch_get_main_queue(),
            {
                do
                {
                    let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as? [AnyObject]

                    completion(result: json!)
                }
                catch
                {
                    print(error)
                }
            })

        })

        task.resume()
    }

Теперь я вызываю этот метод из другого класса так:

WebService().GetTableDataOfPhase("ORC0005")
    {
        (result: AnyObject) in
        self.data = result as! NSArray
    }

Это работает, как и ожидалось. Теперь я пытаюсь получить результаты от обработчика завершения

поэтому я могу сделать это:

WebService().GetTableDataOfPhase("ORC0005")
        {
            (result: AnyObject) in
            self.data = result as! NSArray
        }

        print(self.data.count)

прямо сейчас self.data.count равен 0, но когда я помещаю этот оператор печати в фигурные скобки, он равен 70, как мне получить результаты вне фигурных скобок, чтобы я мог использовать self.data.count ?


person user979331    schedule 17.08.2016    source источник
comment
Вы должны обновить свой вопрос, показав, как вы на самом деле собираетесь использовать данные.   -  person dan    schedule 17.08.2016
comment
Обработчик завершения вызывается асинхронно. Так сделайте наоборот. Используйте результаты внутри фигурных скобок. И используйте согласованные типы, [AnyObject] -> AnyObject -> NSArray — это три разных типа для одного и того же.   -  person vadian    schedule 17.08.2016


Ответы (2)


Хорошо, вот ваша проблема, вы вызываете dataTaskWithURL(async).

В то время, когда вы делаете:

 print(self.data.count)

Ваш вызов веб-службы еще не завершен.

Когда вы помещаете эту строку в фигурные скобки, она выполняется только тогда, когда на вызов есть ответ. Вот почему он работает так, как ожидалось.

Это вопрос времени, вы пытаетесь оценить значение, которого еще нет.

person brduca    schedule 17.08.2016

В свой класс добавить

var yourData:NSArray? 

И в вашем методе

 WebService().GetTableDataOfPhase("ORC0005")
            {
                (result: AnyObject) in
                for res in result 
              {
                   self.yourData.append(res)
               }


            }

    dispatch_async(dispatch_get_main_queue(), {
    print(self.yourData.count)


    }
person Muhammed    schedule 17.08.2016
comment
Это ничего не меняет, это вопрос времени. - person vadian; 17.08.2016
comment
Это все равно ничего не исправит - person dan; 17.08.2016
comment
отправка строки печати также ничего не меняет. - person vadian; 17.08.2016