通过Swift命令行程序使用NSURLSession

发布于 2021-01-31 23:41:08

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

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

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

关注者
0
被浏览
80
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

    您可以使用信号量来阻止当前线程,并等待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()
    


推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看