[英]Thread safe processing
我有一種算法可以識別照片中的對象。 主要問題是它不是線程安全的,因此,例如,當您設置新配置或在仍在處理差異一個時開始處理新映像時,該算法的行為是不確定的,並且可能會崩潰。 下面,我放上我的代碼和實現不佳的實現。
// config struct
public struct Config {}
// reslut of the algorithm
public struct Product {}
// algorith class
public class Recognizer {
func apply(config: Config)
func process(frame: UIImage) -> Product {
let prodcut = Product()
return prodcut
}
}
// protocol for an object interested in the result of the Recognizer
protocol Observer: class {
func didProcess(frame: UIImage, prodcut: Prodcut)
}
// protocol that wraps Recognizer class
protocol RecognizerService {
func add(observer: Observer)
func remove(observer: Observer)
var recognitionConfig: Config { get set }
func process(frame: UIImage)
}
下面是現在的樣子。
let recognizerQueue: DispatchQueue = DispatchQueue.global(qos: .background)
class HumanFaceRecognizer: RecognizerService {
var recognitionConfig: Config
var observers: [Observer]
let algorythm: Recognizer
private var recognizerQueue: DispatchQueue
init(recognitionConfig: Config,
observers: [Observer] = [],
recognizerQueue: DispatchQueue,
algorythm: Recognizer) {
self.recognitionConfig = recognitionConfig
self.observers = observers
self.recognizerQueue = recognizerQueue
self.algorythm = algorythm
}
func add(observer: Observer) {
observers.append(observer)
}
func remove(observer: Observer) {
observers.remove(observer)
}
func process(frame: UIImage) {
recognizerQueue.async { [weak self, currentFrame = frame, currentConfig = recognitionConfig] in
self?.algorythm.process(frame: currentFrame)
observers.forEach { $0.didProcess(frame: currentFrame, result: currentConfig) }
}
}
我認為將計算分配到后台時做錯了,但是我找不到合適的解決方案。
我認為您提供的代碼不足以清楚地解決您的問題。 如果您發布了崩潰等的一些調用堆棧,將很有幫助。
首先想到的是:
didProcess
。 HumanFaceRecognizer
被調用時didProcess
自己從HumanFaceRecognizer
中didProcess
,即forEach
調用可在修改后的集合上運行。 在這種情況下,應在遍歷之前復制observers數組。 希望這有所幫助 :-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.