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

时间:2016-08-17 15:31:03

标签: ios swift completionhandler

我有一个名为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?< / p>

2 个答案:

答案 0 :(得分:2)

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

当时你这样做:

 print(self.data.count)

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

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

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

答案 1 :(得分:-1)

在你的班级中添加

(defun my-set-mark ()
  (interactive)
  (push-mark (point) t nil))

(defadvice find-file (before set-mark activate) (my-set-mark))
(defadvice goto-char (before set-mark activate) (my-set-mark))
(defadvice goto-line (before set-mark activate) (my-set-mark))
(defadvice isearch-update (before set-mark activate) (my-set-mark))
(defadvice beginning-of-buffer (before set-mark activate) (my-set-mark))
(defadvice end-of-buffer (before set-mark activate) (my-set-mark))

在您的方法中

var yourData:NSArray?