![](/img/trans.png)
[英]How to handle the multiple threads with FMDB Using SQLite In IOS Swift
[英]How handle different threads in recursive function in swift?
我有一个递归函数来计算阶乘,并且我想在后台线程中进行计算,如何处理? 我正在尝试:
func factorial(of number: Double) -> Double {
var result: Double = 0
if number > 170 {
return Double.infinity
}
if number != Double(Int(number)) || number < 1 {return 0}
if number == 1 {
return 1
}
DispatchQueue.global(qos: .background).async {
result = number * factorial(of: number - 1)
}
return result
}
我知道这是错误的,但是我不知道该怎么做。 感谢帮助!
我的建议是将其分为同步和异步功能:
func factorial(of number: Double, completion: @escaping (Double) -> ()) {
DispatchQueue.global(qos: .background).async {
let result = factorial(of: number)
DispatchQueue.main.sync { //I don't know what thread you're intending to use, so I picked main :)
completion(result)
}
}
}
func factorial(of number: Double) -> Double {
var result: Double = 0
if number > 170 {
return Double.infinity
}
if number != Double(Int(number)) || number < 1 {return 0}
if number == 1 {
return 1
}
result = number * factorial(of: number - 1)
return result
}
这样一来,工作就可以以您想要的任何方式进行,而不必担心潜在的线程问题。
我不确定这里是否需要异步操作,但是您可以(也许应该)重构代码。
一个示例可能是:
func factorial(n: Int) -> Int {
return (2...n).reduce(1, *)
}
但是,如果您确实想在后台线程上分派一些工作,那么您可能最好在调用站点分派它。
DispatchQueue.global(qos: .background).async {
print(factorial(n: 12))
}
如果由于某种原因您的代码无法在主线程上运行,并且您希望主线程等待(这对于昂贵的操作来说是个坏主意),则可以使用sync
而不是async
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.