Algorithmia RecognizeCharacters v0.3.0在iOS10与iOS11上响应时间差异求助
我帮你梳理下这个问题的可能原因和解决方案,结合iOS版本差异和你的代码来看,关键点如下:
为什么iOS 11+设备的响应时间明显更长?
- 图片数据体积差异:iOS 11对
UIImage生成PNG数据的逻辑做了调整,生成的文件体积比iOS 10大不少。OCR服务的处理速度和输入图片大小直接挂钩,更大的图片不仅上传耗时久,服务端处理也会更慢。你可以打印下image.png的字节数,对比两个系统下的数值,应该能看到明显差距。 - 网络传输适配问题:iOS 11强化了ATS(App Transport Security)的默认规则,同时
NSURLSession的默认配置在HTTP/2、连接复用等方面有更新。如果你的Algorithmia SDK版本较旧,可能没适配这些变化,导致大文件上传时传输效率下降。 - 计时代码的逻辑错误:看你的代码,
endDate和时间差计算是写在pipe闭包外面的!pipe是异步调用,这意味着你当前计算的时间差其实是发起请求的瞬间耗时,而不是真正从请求到收到响应的完整时间。不过你说实际测试的等待时间差异确实存在,所以这个计时错误是次要问题,但必须修正才能准确排查问题。
需要修改的代码
1. 修正计时逻辑,获取真实耗时
把时间计算移到异步闭包内部,这样才能得到请求从发起到响应的完整时间:
let startDate = Date() print("Start Date/time \(startDate)") let client = Algorithmia.client(simpleKey: "*****") client.algo(algoUri: "ocr/RecognizeCharacters/0.3.0").pipe(data: image.png) { resp, error in // 将时间计算移到闭包内,确保在响应返回后执行 let endDate = Date() let components = Calendar.current.dateComponents([.hour, .minute, .second], from: startDate, to: endDate) print("End Date/time \(endDate) diff \(components.hour ?? 0):\(components.minute ?? 0):\(components.second ?? 0)") if error == nil { // 处理响应的代码 } else { // 处理错误的代码 } }
2. 优化上传的图片大小
在上传前压缩图片,避免iOS 11生成过大的PNG文件。比如先缩放到合适的分辨率,再生成PNG数据:
// 辅助方法:将图片缩放到指定尺寸 func resizedImage(for image: UIImage, targetSize: CGSize) -> UIImage? { let size = image.size let widthRatio = targetSize.width / size.width let heightRatio = targetSize.height / size.height // 取较小的比例,保证图片完整显示 let scaleRatio = min(widthRatio, heightRatio) let newSize = CGSize(width: size.width * scaleRatio, height: size.height * scaleRatio) UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0) image.draw(in: CGRect(origin: .zero, size: newSize)) let resizedImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return resizedImage } // 使用示例:缩放到1024x1024以内再上传 if let resizedImg = resizedImage(for: image, targetSize: CGSize(width: 1024, height: 1024)), let compressedPngData = resizedImg.pngData() { let client = Algorithmia.client(simpleKey: "*****") client.algo(algoUri: "ocr/RecognizeCharacters/0.3.0").pipe(data: compressedPngData) { resp, error in // 处理逻辑 } }
3. 升级Algorithmia SDK
确认你使用的Algorithmia Swift SDK是最新版本,旧版本可能没有适配iOS 11+的网络和系统变化,升级后能解决不少兼容性问题。
iOS 11+对服务代码的要求
- ATS合规:iOS 11默认强制所有网络请求使用HTTPS,Algorithmia的服务本身是HTTPS的,但如果你的项目里有ATS例外配置,需要在
Info.plist中正确设置NSAppTransportSecurity字典,避免请求被系统拦截。 - 后台网络任务规范:如果你的OCR请求需要在后台执行,iOS 11对后台网络任务的限制更严格,必须使用
URLSessionConfiguration.background(withIdentifier:)配置会话,并且正确处理后台完成的回调事件。 - 内存管理优化:iOS 11之后系统对内存的管控更严格,大图片数据容易触发内存警告,导致线程被挂起。上传前压缩图片不仅能减少传输时间,还能降低内存占用,避免这类问题。
内容的提问来源于stack exchange,提问作者SHS
相关产品推荐
相关产品推荐

