Как преобразовать VNDocumentCameraViewControllerDelegate в параллелизм Swift 6IOS

Программируем под IOS
Ответить
Anonymous
 Как преобразовать VNDocumentCameraViewControllerDelegate в параллелизм Swift 6

Сообщение Anonymous »

Итак, у меня есть этот код:

Код: Выделить всё

fileprivate class DocumentScanDelegate: NSObject, VNDocumentCameraViewControllerDelegate {

static let shared = DocumentScanDelegate()

var compressionQuality: CGFloat = 1
var onScanSuccess: (UIImage) -> Void = { _ in }

func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) {

controller.dismiss(animated: true)

guard scan.pageCount >= 1 else { return }
let lastPage = scan.imageOfPage(at: scan.pageCount - 1)
let compressed = lastPage.compressed(quality: compressionQuality)
onScanSuccess(compressed)
}

func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFailWithError error: Error) {
controller.dismiss(animated: true)
}

func documentCameraViewControllerDidCancel(_ controller: VNDocumentCameraViewController) {
controller.dismiss(animated: true)
}

}

У меня 2 ошибки: Статическое свойство «shared» не является безопасным для параллелизма, поскольку тип «DocumentScanDelegate» не относится к «Sendable» ' возможно, имеет общее изменяемое состояние; это ошибка в языковом режиме Swift 6.
  • контроллер 3.dismiss вызовы:
Вызов метода экземпляра основного изолированного актера 'dismiss(animated:completion:)' в синхронном неизолированном контексте ; это ошибка в языковом режиме Swift 6.

И то, и другое имеет смысл. Итак, я добавил @MainActor в DocumentScanDelegate . Затем первое предупреждение исчезло. Но второе предупреждение звучит так:

Основной метод экземпляра, изолированный от актера, 'documentCameraViewController(_:didFinishWith:)' не может использоваться для удовлетворения требований неизолированного протокола; это ошибка в языковом режиме Swift 6.

Затем я использую @preconcurrency для аннотации соответствия VNDocumentCameraViewControllerDelegate:

Код: Выделить всё

@MainActor
fileprivate class DocumentScanDelegate: NSObject, @preconcurrency VNDocumentCameraViewControllerDelegate {
...
}
Этот трюк @preconcurrency очень похож на видео WWDC 2024 (https://developer.apple.com/videos/play ... ?time=1520)
Ошибка становится:

Основной метод экземпляра, изолированный от актера, 'documentCameraViewController(_:didFinishWith:)' не может быть используется для удовлетворения требований неизолированного протокола; это ошибка в языковом режиме Swift 6

Со следующей дополнительной ошибкой:

Класс «VNDocumentCameraScan» не соответствует протоколу «Sendable»

Тогда я использую @preconcurrency import:

Код: Выделить всё

@preconcurrency import VisionKit
То же предупреждение остается.
Есть также новое предупреждение (почему?):

Атрибут @preconcurrency в модуле VisionKit не имеет никакого эффекта


Подробнее здесь: https://stackoverflow.com/questions/787 ... oncurrency
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»