Swift - 从完成处理程序获取结果

问题描述 投票:0回答:2

我有一个名为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,但是当我把这个print语句放在大括号里面时,它是70,如何在花括号之外得到结果所以我可以使用self.data.count?

ios swift completionhandler
2个回答
2
投票

好的,这是你的问题,你正在调用dataTaskWithURL(async)。

当时你这样做:

 print(self.data.count)

您的网络服务电话尚未完成。

当您将此行放在花括号中时,它仅在调用具有响应时运行。这就是它按预期工作的原因。

这是一个时间问题,你想要评估一个尚未存在的价值。


-1
投票

在你的班级添加

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)


    }
© www.soinside.com 2019 - 2024. All rights reserved.