一尘不染

通过Swift命令行程序使用NSURLSession

swift

在集成到更大的应用程序之前,我正在尝试测试一个概念验证的命令行应用程序。我想要做的是使用此示例使用NSURLSession下载一些数据。但是,如果使用简单的OS
X命令行应用程序中给出的示例,则该应用程序将在检索数据之前退出。

如何使用NSURLSession从独立的命令行应用程序下载数据?我所读的内容是使用NSRunLoop,但是我还没有在Swift中找到明确的示例,因此,如果NSRunLoop实际上是可行的方法,那么任何示例都将不胜感激。

也欢迎任何其他从Swift命令行应用程序从URL下载数据的策略(无限while循环吗?)。


阅读 238

收藏
2020-07-07

共1个答案

一尘不染

您可以使用信号量来阻止当前线程,并等待URL会话结束。

创建信号灯,启动您的URL会话,然后等待该信号灯。从您的URL会话完成回调中,发出信号量。

您可以使用全局标志(声明一个易失的布尔变量)并从while循环中轮询它,但这并不是最佳选择。一方面,您不必要地消耗了CPU周期。

这是我使用游乐场做的一个简单示例:

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()
2020-07-07