我正在尝试测试一些概念验证命令行应用程序,然后将其集成到更大的应用程序中。我想做的是使用 NSURLSession 下载一些数据这个例子 https://medium.com/swift-programming/learn-nsurlsession-using-swift-ebd80205f87c。然而,如果我使用简单的 OS X 命令行应用程序中给出的示例,那么该应用程序会在检索数据之前退出。
如何使用 NSURLSession 从独立命令行应用程序下载数据?我读到的是使用NS运行循环 https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/Foundation/Classes/NSRunLoop_Class/index.html然而我还没有在 Swift 中找到一个清晰的例子,所以如果 NSRunLoop 实际上是可行的方法,那么任何例子都会受到赞赏。
任何其他从 Swift 命令行应用程序的 URL 下载数据的策略也是受欢迎的(无限 while 循环?)。
您可以使用信号量来阻止当前线程并等待 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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)