我的CoreData中有(n)个数据(UIImage JPEG)。
let imageData: [Data]...
我已经有了这两个框架/ Pod:Zip和ZIPFoundation
我对此有几个疑问:
在那之后,我有了一个URL数组,所以我只需要创建一个Zip文件并共享它。但这不起作用,我在Mac上看到一个.zip-.cpgz循环。
private func createURLsFrom(imageData: [ImageData]?) {
var urlArray = [URL]()
imageData?.forEach { imData in
if let data = imData.imageData,
let tempURL = NSURL.fileURL(withPathComponents: [NSTemporaryDirectory(), NSUUID().uuidString])?.appendingPathExtension("jpg") {
do {
try data.write(to: tempURL)
urlArray.append(tempURL)
} catch {...}
}
}
self.createZipFile(urlArray: urlArray)
}
private func createZipFile(urlArray: [URL]) {
if let zipURL = try? Zip.quickZipFiles(urlArray, fileName: "ZIP_Test1") {
self.sendEmailWith(dataURL: zipURL)
} else {...}
}
private func sendEmailWith(dataURL: URL) {
if MFMailComposeViewController.canSendMail() {
let mailComposer = MFMailComposeViewController()
mailComposer.mailComposeDelegate = self
mailComposer.setSubject("setSubject")
mailComposer.setMessageBody("setMessageBody", isHTML: false)
mailComposer.addAttachmentData(dataURL.dataRepresentation, mimeType: "application/zip", fileName: ("ZIP_Test1.zip"))
self.present(mailComposer, animated: true, completion: nil)
}
}
我在做什么错了:(
答案 0 :(得分:2)
这有点冗长,并且-免责声明 –未测试。让我知道它是否有效,或者您有任何疑问。
为所有文件创建一个临时目录:
func createTempDirectory() -> URL? {
if let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
let dir = documentDirectory.appendingPathComponent("temp-dir-\(UUID().uuidString)")
do {
try FileManager.default.createDirectory(atPath: dir.path, withIntermediateDirectories: true, attributes: nil)
} catch {
print(error.localizedDescription)
}
return dir
} else {
return nil
}
}
将所有图像保存到temp目录:
func saveImages(data: [Data]) -> URL? {
guard let directory = createTempDirectory() else { return nil }
do {
for (i, imageData) in data.enumerated() {
try imageData.write(to: directory.appendingPathComponent("image\(i).jpg"))
}
return directory
} catch {
return nil
}
}
获取压缩文件的URL。如果在执行过程中发生错误,这是可选的。另外,在后台线程上完成,因为这可能会花费一些时间,并且您不想阻塞主线程。
func zipImages(data: [Data], completion: @escaping ((URL?) -> ())) {
DispatchQueue.main.async {
guard let directory = saveImages(data: data) else {
completion(nil)
return
}
do {
let zipFilePath = try Zip.quickZipFiles([directory], fileName: "archive-\(UUID().uuidString)")
completion(zipFilePath)
} catch {
completion(nil)
}
}
}
发送文件后,您可能需要删除temp目录,以便您的应用程序大小不会开始增长。
答案 1 :(得分:0)
移动
self.createZipFile(urlArray: urlArray)
到forEach
循环之后。
答案 2 :(得分:0)
最后经过大量调试,我找到了问题。 首先, Daniels 答案也是正确的。
但是主要问题是我的sendEmailWith
函数,“ application / zip” 无法正常工作!
因此,我在目录UIActivityViewController
中添加了目录URL,它可以正常工作。
现在我可以通过Mail和Airdrop共享我的Zip文件!