100天Swift学习挑战#1:http网络请求与spawn子进程

开始教程之前,尝试了几个常用的NodeJS逻辑的Swift实现

发起网络请求

js里面axios非常方便,swift貌似没有axios支持,但是有Alamofire,然而Swift Package Manage实在是太难搞了,添加半天结果网络错误,于是先尝试不用库的实现:

let session = URLSession.shared
let url = URL(string: "https://example.com")!
let task = session.dataTask(with: url, completionHandler: { data, response, error in
    guard error == nil else {
        print(error)
        return
    }
    print(data)
})
task.resume()

看起来非常像JS的异步请求,估计可以有类似async/await的处理方式

以上是通用的请求,如果仅仅是发起一个不自定义header的get请求,有更方便的方式(类似PHP的filegetcontent)

let url = URL(string: "https://example.com")!
let data = try Data(contentsOf: url)
print(data)

child_process的spawn子进程

运行子进程并且获取进程的输出

let runloop = RunLoop.current
let process = Process()

process.executableURL = homeDirURL.appendingPathComponent(".v2ray")
process.arguments = ["-config", homeDirURL.appendingPathComponent(".config.json").path]
let pipe = Pipe()
process.standardOutput = pipe

pipe.fileHandleForReading.readabilityHandler = { fileHandle in
    let data = fileHandle.availableData
    let message = String(data: data, encoding: .utf8) ?? ""
    print(message)
}

try? process.run()
while runloop.run(mode: .default, before: Date(timeIntervalSinceNow: 2)) { }

和Node不同的是,父进程被终止后,子进程不会自动退出,暂时没有找到方法。

文章原始链接:https://sijie.wang/posts/swift-challenge-1/

本站文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请保留原始链接