使用此代码,我从共享扩展中提取图像,然后将其写入我在应用程序组中创建的目录。
let content = self.extensionContext!.inputItems[0] as! NSExtensionItem
let contentType = kUTTypeImage as String
for attachment in content.attachments as! [NSItemProvider] {
if attachment.hasItemConformingToTypeIdentifier(contentType) {
attachment.loadItem(forTypeIdentifier: contentType, options: nil) { data, error in
// from here
if error == nil {
let url = data as! NSURL
let originalFileName = url.lastPathComponent
if let imageData = NSData(contentsOf: url as URL) {
let img = UIImage(data:imageData as Data)
if let data = UIImagePNGRepresentation(img!) {
// write, etc.
}
}
}
}
一切正常。
我想知道的是,是否可以减少某些代码:特别是在if error == nil
之后,我:
NSURL
; NSURL
获取NSData
; NSData
获取UIImage
; UIImage
获取UIImagePNGRepresentation
; 除了避免创建imageData变量之外,还没有办法(安全地)用更少的步骤实现相同的目标吗?
答案 0 :(得分:1)
首先,您需要使用原生Data
和URL
代替NSData
& NSURL
如果您想在DocumentDirectory
中编写文件,那么您可以直接使用该imageData,无需从中生成UIImage
个对象,然后使用UIImagePNGRepresentation
将其转换为数据。
if let url = data as? URL, error == nil {
let originalFileName = url.lastPathComponent
if let imageData = try? Data(contentsOf: data) {
// write, etc.
var destinationURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
destinationURL.appendPathComponent("fileName.png")
try? imageData.write(to: destinationURL)
}
}