我有一个名为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?
好的,这是你的问题,你正在调用dataTaskWithURL(async)。
当时你这样做:
print(self.data.count)
您的网络服务电话尚未完成。
当您将此行放在花括号中时,它仅在调用具有响应时运行。这就是它按预期工作的原因。
这是一个时间问题,你想要评估一个尚未存在的价值。
在你的班级添加
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)
}