1

このコードを使用して、共有拡張機能から画像を抽出し、それをアプリ グループに作成したディレクトリに書き込みます。

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 変数の作成を回避する以外に、より少ない手順で同じ目標を (安全に) 達成する方法はありませんか?

4

1 に答える 1

1

まず、ネイティブを使用する必要がありData、&URLの代わりにファイルを書き込みたい場合は、その imageData を直接使用して、そこからオブジェクトを作成し、 を使用してデータに変換する必要はありません。NSDataNSURLDocumentDirectoryUIImageUIImagePNGRepresentation

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)
    }
}
于 2016-11-28T09:22:12.360 に答える