Как пометить результат распознавания текста Vision как отправляемый в Swift 6IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Как пометить результат распознавания текста Vision как отправляемый в Swift 6

Сообщение Anonymous »

У меня есть следующий код. Он просто запускает Vision API, чтобы получить текст из изображения. Я использую очень простой GCD, чтобы отправить тяжелую операцию Vision в фоновую очередь, а затем отправить ее обратно в основную очередь для завершения.:

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

public struct TextRecognitionResult {
let observation: VNRecognizedTextObservation
let text: VNRecognizedText
let rect: CGRect
}

public enum TextRecognitionUtil {

private static let queue = DispatchQueue(label: "text_recognition", qos: .userInitiated)

public static func process(
image: UIImage,
recognitionLevel: VNRequestTextRecognitionLevel,
completion: @Sendable @escaping ([TextRecognitionResult]) -> Void)
{
guard let cgImage = image.cgImage else {
completion([])
return
}
let request = VNRecognizeTextRequest { (request, error) in
guard
error == nil,
let observations = request.results as? [VNRecognizedTextObservation]
else {
DispatchQueue.main.async {
completion([])
}
return
}

var results = [TextRecognitionResult]()

// Vision's origin is on bottom left
let transform = CGAffineTransform.identity
.scaledBy(x: 1, y: -1)
.translatedBy(x: 0, y: -image.size.height)
.scaledBy(x: image.size.width, y: image.size.height)

for observation in observations {
guard let text = observation.topCandidates(1).first else { continue }
let rect = observation.boundingBox.applying(transform)
results += [TextRecognitionResult(observation: observation, text: text, rect: rect)]
}
DispatchQueue.main.async {
completion(results)
}
}

request.recognitionLevel = recognitionLevel
self.queue.async {
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try? handler.perform([request])
}
}
}

Этот код нарушает параллелизм Swift 6, поскольку TextRecognitionResult не подлежит отправке:

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

Sending 'results' risks causing data races; this is an error in the Swift 6 language mode
Однако мой TextRecognitionResult не может быть напрямую помечен как отправляемый, поскольку VNRecouncedTextObservation и VNRecouncedText не являются отправляемыми, и оба они определены типами в Видении, которое я не могу изменить. Это довольно распространенная практика в GCD. Я не знаю, что здесь делать.

Подробнее здесь: https://stackoverflow.com/questions/787 ... in-swift-6
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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