【问题标题】:Swift - get results from completion handlerSwift - 从完成处理程序获取结果
【发布时间】:2016-08-17 15:31:03
【问题描述】:

我在一个名为 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 ?

【问题讨论】:

  • 您应该更新您的问题,显示您实际打算如何使用数据。
  • 异步调用完成处理程序。所以反过来做。使用花括号的结果。并使用一致的类型,[AnyObject] -> AnyObject -> NSArray 是同一事物的三种不同类型。

标签: ios swift completionhandler


【解决方案1】:

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

当时你这样做:

 print(self.data.count)

您的网络服务调用尚未完成。

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

这是一个时间问题,您要评估一个尚不存在的值。

【讨论】:

    【解决方案2】:

    在你的班级添加

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

    【讨论】:

    • 这并没有改变什么,这是一个时间问题。
    • 这仍然无法解决任何问题
    • dispatching打印行也没有任何改变。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    相关资源
    最近更新 更多