swift2 如何防止命令行工具在异步操作完成之前退出

kqlmhetl  于 2022-11-06  发布在  Swift
关注(0)|答案(7)|浏览(198)

在一个swift 2命令行工具(main.swift)中,我有以下代码:

import Foundation
print("yay")

var request = HTTPTask()
request.GET("http://www.stackoverflow.com", parameters: nil, completionHandler: {(response: HTTPResponse) in
    if let err = response.error {
        print("error: \(err.localizedDescription)")
        return //also notify app of failure as needed
    }
    if let data = response.responseObject as? NSData {
        let str = NSString(data: data, encoding: NSUTF8StringEncoding)
        print("response: \(str)") //prints the HTML of the page
    }
})

控制台显示“yay”,然后退出(程序结束,退出代码:0),似乎从来没有等待请求完成。我该如何防止这种情况发生?
代码使用swiftHTTP
我想我可能需要一个NSRunLoop,但没有快速的示例

jslywgbw

jslywgbw1#

RunLoop.main.run()添加到文件末尾是一种选择。

gajydyqb

gajydyqb2#

我知道这是一个老问题,但这里是我最后的解决方案。使用DispatchGroup

let dispatchGroup = DispatchGroup()

for someItem in items {
    dispatchGroup.enter()
    doSomeAsyncWork(item: someItem) {
        dispatchGroup.leave()
    }
}

dispatchGroup.notify(queue: DispatchQueue.main) {
    exit(EXIT_SUCCESS)
}
dispatchMain()
csga3l58

csga3l583#

你可以在main的末尾调用dispatchMain()。这会运行GCD主队列调度程序,并且永远不会返回,因此它会阻止主线程退出。然后你只需要显式调用exit(),在你准备好的时候退出应用程序(否则命令行应用程序会挂起)。

import Foundation

let url = URL(string:"http://www.stackoverflow.com")!
let dataTask = URLSession.shared.dataTask(with:url) { (data, response, error) in
    // handle the network response
    print("data=\(data)")
    print("response=\(response)")
    print("error=\(error)")

    // explicitly exit the program after response is handled
    exit(EXIT_SUCCESS)
}
dataTask.resume()

// Run GCD main dispatcher, this function never returns, call exit() elsewhere to quit the program or it will hang
dispatchMain()
tvokkenx

tvokkenx4#

不要看时机你应该试试这个

let sema = DispatchSemaphore(value: 0)

let url = URL(string: "https://upload.wikimedia.org/wikipedia/commons/4/4d/Cat_November_2010-1a.jpg")!

let task = URLSession.shared.dataTask(with: url) { data, response, error in
  print("after image is downloaded")

  // signals the process to continue
  sema.signal()
}

task.resume()

// sets the process to wait
sema.wait()
shstlldc

shstlldc5#

如果您的需求不是需要“生产级”代码的东西,而是一些 * 快速试验或试用代码 *,您可以这样做:

SWIFT 3

//put at the end of your main file
RunLoop.main.run(until: Date(timeIntervalSinceNow: 15))  //will run your app for 15 seconds only

更多信息:https://stackoverflow.com/a/40870157/469614

请注意,您不应依赖架构中的固定执行时间。

jtoj6r0c

jtoj6r0c6#

雨燕4:RunLoop.main.run()
在文件的末尾

相关问题