多次调用(在实际设备上)iOS 13 时,QLThumbnailGenerator 开始失败

Lob*_*obo 5 ios swift ios13

我试图通过在特定文件夹中的所有(大约 200 个)通行证上运行循环并为每个通行证调用generateBestRepresentation(for:) 来创建多个钱包通行证(.pkpass)的缩略图。

\n\n

这是代码:

\n\n
let passesDirURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("Passes")\nlet size = CGSize(width: 1600, height: 1600)\nlet scale = UIScreen.main.scale\n\nif let passURLs = try? FileManager.default.contentsOfDirectory(\n    at: self.passesDirURL,\n    includingPropertiesForKeys: nil,\n    options: .skipsHiddenFiles\n    ),\n   !passURLs.isEmpty {\n    for passURL in passURLs {\n        // Create the thumbnail request.\n        let request = QLThumbnailGenerator.Request(\n            fileAt: passURL,\n            size: size,\n            scale: scale,\n            representationTypes: .thumbnail\n        )\n\n        // Retrieve the singleton instance of the thumbnail generator and generate the thumbnails.\n        let generator = QLThumbnailGenerator.shared\n        generator.generateBestRepresentation(for: request) { thumbnail, error in\n            if let error = error as? QLThumbnailError {\n                print ("Thumbnail generation error: \\(error)")\n                print ("Thumbnail generation localizedDescription: \\(error.localizedDescription)")\n                print ("Thumbnail generation errorUserInfo: \\(error.errorUserInfo)")\n                print ("Thumbnail generation errorCode: \\(error.errorCode)")\n            } else {\n                print ("Thumbnail generation OK")\n                //do something with thumbnail here\n            }\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这在模拟器上工作得很好,但在实际设备(iPhone Xs Max)上我迟早会开始遇到错误,并且大部分通道的缩略图生成都会失败。输出如下所示:

\n\n
Thumbnail generation error: related decl \'e\' for QLThumbnailError(_nsError: Error Domain=QLThumbnailErrorDomain Code=3 "No thumbnail in the cloud for file:///private/var/mobile/Containers/Data/Application/DCF703F7-9A1A-4340-86EB-42579D678EEF/Documents/Passes/pass123.pkpass" UserInfo={NSErrorFailingURLKey=file:///private/var/mobile/Containers/Data/Application/DCF703F7-9A1A-4340-86EB-42579D678EEF/Documents/Passes/pass123.pkpass})\nThumbnail generation localizedDescription: The operation couldn\xe2\x80\x99t be completed. (QLThumbnailErrorDomain error 3.)\nThumbnail generation errorUserInfo: ["NSErrorFailingURLKey": file:///private/var/mobile/Containers/Data/Application/DCF703F7-9A1A-4340-86EB-42579D678EEF/Documents/Passes/pass123.pkpass]\nThumbnail generation errorCode: 3\n
Run Code Online (Sandbox Code Playgroud)\n\n

错误描述听起来令人困惑(“云中没有文件的缩略图”),因为这些不是 iCloud 文件。

\n\n

由于单独调用缩略图生成时不会发生错误,这似乎是一些内存/性能问题。我尝试通过多种方式解决问题,包括在 for 循环中使用信号量等待generateBestRepresentation 的一次调用完成以开始下一次调用,这减少了但没有消除问题。唯一没有错误的方法是在 semaphore.wait() 语句之后添加一个很长的睡眠(5 秒),但这不是可接受的解决方案。

\n\n

我尝试的另一种方法是使用 saveBestRepresentation (如 Apple 文档中建议的那样),但这并没有解决问题。

\n\n

有没有人遇到过类似的问题并能够找到可接受的解决方案?

\n