过去通过 NSURLConnection.sendSynchronousRequest() 方法能同步请求数据。从iOS9起,苹果废除 NSURLConnection,使用 URLSession 代替 NSURLConnection。
如果想要 URLSession 也能够同步请求,即数据获取后才继续执行下面的代码,使用信号、信号量就可以实现。
样例如下:
//创建URL对象 let urlString:String="http://www.hangge.com" let url = URL(string:urlString) //创建请求对象 let request = URLRequest(url: url!) let session = URLSession.shared let semaphore = DispatchSemaphore(value: 0) let dataTask = session.dataTask(with: request, completionHandler: {(data, response, error) -> Void in if error != nil{ print(error!) }else{ let str = String(data: data!, encoding: String.Encoding.utf8) print(str!) } semaphore.signal() }) as URLSessionTask //使用resume方法启动任务 dataTask.resume() _ = semaphore.wait(timeout: DispatchTime.distantFuture) print("数据加载完毕!") //继续执行其他代码.......
运行结果如下: