这个RxSwift代码运行得很慢,所以你能给我一个如何提高它性能的建议吗?
此功能是获取图像资源并将其映射到重新绘制的图像中
func redrawChapter(pages: [Resource]) -> Single<[UIImage]> {
return Observable
.from(pages)
.flatMap(getImage)
// MARK: Detect synopsys
.flatMap(recognizeText)
// MARK: Translate synopsys
.concatMap(translate)
// MARK: Image redraw
.concatMap(redrawImage)
.toArray()
}
我在用翠鸟下载图片
private func getImage(resource: Resource) -> Single<UIImage> {
return Single.create { single in
let disposables = Disposables.create()
KingfisherManager.shared.retrieveImage(with: resource) { result in
switch result {
case .success(let value):
single(.success(value.image))
case .failure(let error):
single(.failure(error))
}
}
return disposables
}
}
我正在使用Apple Vision来识别文本区域
private func recognizeText(image: UIImage) -> Single<(UIImage, [Synopsis])> {
return Observable.of(image)
.flatMap {
Observable.combineLatest(
Observable.just($0),
// MARK: Apple vision to detect text regions
self.imageProcessor.getRecognizedText(image: $0).asObservable()
)
}
.asSingle()
}
和网络方面的莫亚
private func translate(image: UIImage, synopsys: [Synopsis]) -> Maybe<(UIImage, [Synopsis])>{
return Observable.from(synopsys)
.flatMap {
Observable.combineLatest(
Observable.just($0.rect),
self.translator.translate(text: $0.text).asObservable()
)
}
.compactMap {
return Synopsis(
text: $0.1,
rect: $0.0
)
}
.toArray()
.compactMap {
return (image, $0)
}
}
使用UIGraphics渲染器重绘图像
private func redrawImage(
image: UIImage,
synopsys: [Synopsis]
) -> Single<UIImage> {
return Single.create { single in
let format = UIGraphicsImageRendererFormat()
format.scale = 1
guard let cgImage = image.cgImage else {
return Disposables.create()
}
let size = image.size
let bounds = CGRect(
origin: .zero,
size: size
)
let final = UIGraphicsImageRenderer(
bounds: bounds,
format: format
).image { context in
image.draw(in: bounds)
for syn in synopsys {
let backgroundColor = cgImage.averageColorOf(rect: syn.rect)
let textColor = backgroundColor.textColor()
self.setupLabel(
text: syn.text,
backgroundColor: backgroundColor,
textColor: textColor,
bounds: syn.rect,
context: context.cgContext
)
}
}
single(.success(final))
return Disposables.create()
}
}
我觉得有另一种方法可以不让如此大量的可观测数据发挥作用,让它发挥作用,也许它会以某种方式提高这种功能的性能.感谢你的帮助.