使用此代码,i 提取来自共享扩展名的图像,然后将其写入我在应用程序组中创建的目录。
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
之后,I:
- 将数据施加到
NSURL
; - 使用
NSURL
获得NSData
; - 使用
NSData
获取UIImage
; - 使用
UIImage
获取UIImagePNGRepresentation
;
除了避免创建ImageData变量外,没有一种方法(安全地)以更少的步骤实现相同的目标?
首先,您需要使用本机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)
}
}