macos - 从 Swift 命令行程序使用 NSURLSession

标签 macos swift nsurlsession nsrunloop

在将它集成到更大的应用程序之前,我正在尝试测试一个小的概念验证命令行应用程序。我想做的是使用 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/

相关文章:

macos - Mac OS X cron 日志/跟踪

ios - `application:openURL:options` 期间网络连接丢失

ios - 如何检查 dataTaskWithRequest 是否完成?

macos - 如何避免使用 MacPorts 安装不必要的依赖项?

cocoa - 开始 Mac OS X 编程

svn - 苹果电脑 : Setting up SVN for personal development

ios - 一次调用多个deleteRowsAtIndexPaths

macos - 等待完成处理程序完成

ios - 如何从 UINavigationController 获取当前的堆栈顶部?

swift - 如何从 NSURLSession.sharedSession().dataTaskWithRequest 获取数据