Skip to content

Commit

Permalink
Improve RecognizerController
Browse files Browse the repository at this point in the history
  • Loading branch information
mvasilak committed Feb 19, 2025
1 parent e729e5e commit fe9adc2
Showing 1 changed file with 15 additions and 8 deletions.
23 changes: 15 additions & 8 deletions Zotero/Controllers/RecognizerController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,8 @@ final class RecognizerController {
case recognitionInProgress
case remoteRecognitionInProgress(data: [String: Any])
case identifierLookupInProgress(response: RemoteRecognizerResponse, identifier: String)
case translated(item: ItemResponse)
case createdParent(key: String)
case translated(itemResponse: ItemResponse)
case createdParent(item: RItem)
}

let task: RecognizerTask
Expand All @@ -125,6 +125,10 @@ final class RecognizerController {
private let accessQueueLabel: String
private let accessQueue: DispatchQueue
private let backgroundQueue: DispatchQueue
private let updatesSubject: PublishSubject<Update>
var updates: Observable<Update> {
updatesSubject.asObservable()
}
private let disposeBag: DisposeBag

internal weak var webViewProvider: WebViewProvider?
Expand Down Expand Up @@ -154,25 +158,28 @@ final class RecognizerController {
accessQueue = DispatchQueue(label: accessQueueLabel, qos: .userInteractive, attributes: .concurrent)
accessQueue.setSpecific(key: dispatchSpecificKey, value: accessQueueLabel)
backgroundQueue = DispatchQueue(label: "org.zotero.RecognizerController.backgroundQueue", qos: .userInitiated)

updatesSubject = PublishSubject()
disposeBag = DisposeBag()
}

// MARK: Actions
func queue(task: RecognizerTask, completion: @escaping (_ observable: PublishSubject<Update>?) -> Void) {
func queue(task: RecognizerTask, completion: @escaping (_ observable: Observable<Update>?) -> Void) {
accessQueue.async(flags: .barrier) { [weak self] in
guard let self else {
completion(nil)
return
}
if let (_, observable) = queue[task] {
completion(observable)
completion(observable.asObservable())
return
}
let state: RecognizerTaskState = .enqueued
let observable: PublishSubject<Update> = PublishSubject()
queue[task] = (state, observable)
completion(observable)
completion(observable.asObservable())
observable.subscribe(onNext: { [weak self] update in
self?.updatesSubject.on(.next(update))
}).disposed(by: disposeBag)

startRecognitionIfNeeded()
}
Expand Down Expand Up @@ -497,7 +504,7 @@ final class RecognizerController {
switch task.kind {
case .simple:
cleanupTask(for: task) { observable in
observable?.on(.next(Update(task: task, kind: .translated(item: itemResponse))))
observable?.on(.next(Update(task: task, kind: .translated(itemResponse: itemResponse))))
}

case .createParentForItem(let libraryId, let key):
Expand All @@ -513,7 +520,7 @@ final class RecognizerController {
return
}
try coordinator.perform(request: MoveItemsToParentDbRequest(itemKeys: [key], parentKey: parent.key, libraryId: libraryId))
update = Update(task: task, kind: .createdParent(key: parent.key))
update = Update(task: task, kind: .createdParent(item: parent))
coordinator.invalidate()
}
} catch let error {
Expand Down

0 comments on commit fe9adc2

Please sign in to comment.