【发布时间】:2018-08-10 07:08:39
【问题描述】:
我尝试了 stackoverflow 上给出的多个解决方案/答案,但没有一个对我有用。其中一些如下:
https://stackoverflow.com/a/30495424/3145189
Is this safe to call wait() of DispatchSemaphore several times at one time?
https://stackoverflow.com/a/37155631/3145189
我正在尝试实现非常简单的事情,代码块或函数应该串行执行,无论它是从哪个线程调用的。
我的示例代码:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
DispatchQueue.global().async {
self.testLog(name:"first")
}
DispatchQueue.global().async {
self.testLog(name:"second")
}
DispatchQueue.main.async {
self.testLog(name: "mainthread")
}
}
func testLog(name:String) -> Void {
for i in 1..<1000 {
print("thread test \(i) name =\(name)")
}
}
所以输出应该是 -
第一个线程调用
线程测试 1 名称 =first
线程测试 2 名称 =first
线程测试 3 名称 =first
.
.
.
线程测试 999 名称 =first
第二个线程调用
线程测试 1 名称 =second
线程测试 2 名称 =second
.
.
.
线程测试 999 名称 =second
主线程调用
线程测试 1 名称 =mainthread
线程测试 2 名称 =mainthread
.
.
.
线程测试 999 名称 =主线程
如果函数在第一个线程上被调用,它应该只为第一个线程继续打印日志。线程的顺序可能会有所不同我不在乎意味着即使它首先打印主线程日志然后是第二个和第一个无关紧要的日志应该被分组。
【问题讨论】:
-
我尝试了多种方法,但在我的问题的示例代码中未提及,因此请您在发布前测试您的答案
-
创建一个串行队列并将 testLog() 添加到队列中。
标签: ios swift xcode multithreading locking