在将它集成到更大的应用程序之前,我正在尝试测试一个小的概念验证命令行应用程序。我想做的是使用 NSURLSession 下载一些数据 this example .但是,如果我使用简单的 OS X 命令行应用程序中给出的示例,那么应用程序会在检索数据之前退出。
如何使用 NSURLSession 从独立的命令行应用下载数据?我读到的是使用 NSRunLoop但是我还没有在 Swift 中找到一个明确的例子,所以如果 NSRunLoop 实际上是要走的路,那么任何例子都将不胜感激。
也欢迎使用任何其他从 Swift 命令行应用程序的 URL 下载数据的策略(无限 while 循环?)。
最佳答案
您可以使用信号量来阻止当前线程并等待您的 URL session 完成。
创建信号量,启动 URL session ,然后等待信号量。从您的 URL session 完成回调中,发出信号量。
您可以使用一个全局标志(声明一个 volatile bool 变量)并从 while 循环中轮询它,但这并不是最佳选择。一方面,您不必要地消耗了 CPU 周期。
这是我使用 playground 做的一个简单示例:
import Foundation
var sema = DispatchSemaphore( value: 0 )
class Delegate : NSObject, URLSessionDataDelegate
{
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data)
{
print("got data \(String(data: data, encoding: .utf8 ) ?? "<empty>")");
sema.signal()
}
}
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config, delegate: Delegate(), delegateQueue: nil )
guard let url = URL( string:"http://apple.com" ) else { fatalError("Could not create URL object") }
session.dataTask( with: url ).resume()
sema.wait()
关于macos - 从 Swift 命令行程序使用 NSURLSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30702387/