【发布时间】:2016-06-19 11:03:23
【问题描述】:
我进入并发编程时遇到了一些信号量问题。 我的函数首先从服务器加载数据,分析接收到的信息,然后在必要时向服务器发出第二个请求。
我尝试了不同的方法让它运行,但没有一个做得很好。 我当前的代码 FOR ME 似乎是正确的,但在第二次请求时它只是锁定(可能像死锁)并且最后一个日志是“<__nscflocaldatatask:>{ taskIdentifier: 2 } {suspended }”
请告诉我我不知道什么。也许有更优雅的方式来完成这些目的?
提前谢谢你!
var users = [Int]()
let linkURL = URL.init(string: "https://bla bla")
let session = URLSession.shared()
let semaphore = DispatchSemaphore.init(value: 0)
let dataRequest = session.dataTask(with:linkURL!) { (data, response, error) in
let json = JSON (data: data!)
if (json["queue"]["numbers"].intValue>999) {
for i in 0...999 {
users.append(json["queue"]["values"][i].intValue)
}
for i in 1...lround(json["queue"]["numbers"].doubleValue/1000) {
let session2 = URLSession.shared()
let semaphore2 = DispatchSemaphore.init(value: 0)
let linkURL = URL.init(string: "https://bla bla")
let dataRequest2 = session2.dataTask(with:linkURL!) { (data, response, error) in
let json = JSON (data: data!)
print(i)
semaphore2.signal()
}
dataRequest2.resume()
semaphore2.wait(timeout: DispatchTime.distantFuture)
}
}
semaphore.signal()
}
dataRequest.resume()
semaphore.wait(timeout: DispatchTime.distantFuture)
附:我为什么要这样做。服务器返回有限数量的数据。为了获得更多,我必须使用偏移量。
【问题讨论】:
-
为什么需要信号量?基本上你需要在第一次调用的闭包内运行第二个服务器请求,第二个闭包(内部)应该通过另一个闭包发送结果。如果你认为这是你需要的,我会给你一个代码片段。
-
@OhadM 据我所知,闭包在不同的线程上运行,因此主线程不会等待闭包中的代码完成。就我而言,它甚至没有开始执行。操场就停了。这就是我使用信号量的原因。
-
1.如果你告诉闭包在不同的线程上运行,闭包将在不同的线程上运行,因此它们也可以在主线程上运行。 2. 你为什么用操场?你需要在整个应用环境中测试你的代码
-
@OhadM in Playground 我测试我的应用程序模块,它比编译整个应用程序要快。好的,所以闭包默认在后台运行并在主线程上运行,我只需要使用 dispatch..get_global_queue 告诉它,并进行两次:第一个请求和第二个请求?
-
闭包在你创建它们的线程上运行,除非函数在不同的线程上显式调用回调。在这种情况下,除非您另有说明,否则它们都将在主线程上运行。
标签: ios swift concurrency semaphore