多线程调用同一函数Swift/SwiftUI

ssm49v7z  于 2023-06-21  发布在  Swift
关注(0)|答案(1)|浏览(119)

我有一个场景,线程调用相同的方法,其中有计时器,每个线程的计时器将是不同的,因为线程创建在不同的时间轴的基础上从UI的行动。我怎么能得到计时器值为每个线程分别在单一视图和单一初始化的类,虽然我试图得到不同的响应,但动态创建的线程它没有响应,下面一个我只是在操场上尝试

var groupqueue = DispatchGroup()
private var update: [AnyCancellable] = []
var ticker: Int = 0

groupqueue.enter()
multiplecall(name: "test1")

groupqueue.enter()
multiplecall(name: "test2")

func multiplecall(name: String){
    Timer.publish(every: 1, on: .main, in: .common)
        .autoconnect()
        .sink { _ in fetchValues() }
        .store(in: &update)

}

func fetchValues(){
        ticker += 1
        print(ticker)
    }

所需输出:1 1、2 2、3 3...\n
**我得到了什么:一二三四

enyaitl3

enyaitl31#

您的代码示例不完整。有些变量没有声明,也不清楚为什么要使用调度组,传递给multicall的名称没有使用。有许多问题。
我将你的代码复制到Playground中,并按如下方式编辑它:

import UIKit
import Combine

var subscriptions = Set<AnyCancellable>()

func multiplecall(name: String) {
    Timer.publish(every: 1, on: .main, in: .common)
        .autoconnect()
        .scan(1) { value, _ in value + 1 }
        .sink(receiveValue: fetchValues)
        .store(in: &subscriptions)
}

func fetchValues(ticker: Int){
    print(ticker)
}

multiplecall(name: "test1")
multiplecall(name: "test2")

这将产生您所期望的输出。
我注意到这段代码似乎不是多线程的。计时器设置为在主线程上发布,因此此示例中的所有代码都将在主线程上运行。计时器本身可能在单独的线程上运行(我还没有看过Timer是如何实现的),但计时器事件被传递到主运行循环。

相关问题