こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

締切り済みの質問

Swiftについて教えてください

前回PHAssetからNSDataへの変換のしかたを質問させていただき、回答をいただきました。それを参考にいろいろ調べてみたのですが、勉強不足で解決できませんでした。
requestImageDataForAssetを使いPHAssetから直接NSDataを作れることは分かったのですが、具体的な使い方が分からず、投稿させていただきました。

前回の質問で回答をいただいた
func requestImageDataForAsset(_ asset: PHAsset,
options options: PHImageRequestOptions?,
resultHandler resultHandler: (NSData?,
String?,
UIImageOrientation,
[NSObject : AnyObject]?) -> Void) -> PHImageRequestID
これが理解できずにいます。

aseetという配列の中にPHAssetが入っており、1つずつPHAssetを取り出し、NSDataに変換し、nsdataという配列に格納していきたいと考えています。

requestImageDataForAssetを使って上記のようなことをするにはどのようにしたらよいのか教えてください。

投稿日時 - 2016-08-19 15:02:00

QNo.9217306

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(3)

ANo.3

No.2の補足の質問について回答します。

> 後置クロージャを普通にしたら
> {
> image, info in
> //ここでUIImageを取得します。
> self.photoImageView.image = image
> print("UIImage get!");
> }
> は、下記と同じということでいいのでしょうか?
> resultHandler:{(image,info)->Void in
> //ここでUIImageを取得します。
> self.photoImageView.image = image
> print("UIImage get!");
> })
> resultHandlerは書く必要はないのでしょうか?

同じです。
resultHandlerは書く必要ありません。
安易に質問しないで、疑問に思うなら実際に両方のコーディングを
自分で動かして試してみてください。それでもし同じでないと思う状況を見つけたのなら
その具体例を説明して質問してください。

> image, infoがどこと関係してるのかがよく分かりません。
> imageはUIImageを定義しておくのでしょうか?
> infoは何を意味していますか?

クロージャの引数は、AppleのリファレンスのrequestImageForAssetの説明にある通り
resultHandler: (UIImage?, [NSObject : AnyObject]?) -> Void)
と定義されていて、
第1パラメータはUIImage(のオプショナル型)で、
第2パラメータは[NSObject : AnyObject]というDictionary(のオプショナル型)です。
参考サイトのサンプルでは、それにそれぞれimage、infoという名前をつけて受け取っているだけです。(名前は別にimageやinfoじゃなくてもかまいません。参考サイトのサンプルではわかりやすいからそういう名前にしているだけです。)

infoで受け取る内容は、これもAppleのリファレンスにある通り
「A dictionary providing information about the status of the request. See Image Result Info Keys for possible keys and values.」
リクエストの状態についての情報を提供するDictionaryです。
取り得るキーと値については「Image Result Info Keys」を参照してくださいとあるので、
その青いリンクをクリックして
https://developer.apple.com/library/ios/documentation/Photos/Reference/PHImageManager_Class/#//apple_ref/doc/constant_group/Image_Result_Info_Keys
を参照すれば、そこに詳しく説明されています。

このあたりもピンと来なければ、安易に質問する前に
サンプルで示されたものを動かして、実際に受け取ったinfoの値を
printで出力して確認する等、自分で調べる癖をつければ、
実際のイメージがわき、自分で理解できるようになってくるはずです。

投稿日時 - 2016-08-26 14:13:30

ANo.2

No.1です。

> この部分はどういう意味ですか?

これはimageを取得した時に呼び出されるクロージャの呼び出しパラメータ形式を表しています。

> 戻り値のPHImageRequestIDはどんな値なのでしょうか?

参考にしているAppleのリファレンスサイトで、その「->PHImageRequestID」
と描かれている青い文字をクリックしたら、
https://developer.apple.com/library/ios/documentation/Photos/Reference/PHImageManager_Class/#//apple_ref/swift/tdef/c:@T@PHImageRequestID
に移動すると思います。
そこに書かれている通り、イメージ取得要求に対応するIDで、
もし途中でイメージ取得をキャンセルしたくなった時に、
そのIDを使って、どの取得要求をキャンセルするのか指定するのに使います。

> 教えていただいたサイトの以下の部分にないのですが必要ではないのでしょうか?

これは、Trailing Closure(後置クロージャ)と呼ばれるswift独特の書き方で、
最終パラメータにクロージャを記述する場合、通常は、最終パラメータ記述位置に{~}でクロージャを書いて、
最後にメソッドパラメータの終了を意味する閉じかっこ「)」を入れますが、これだと、最後の閉じかっこが「})」の
ようになってややこしくなるので、最終パラメータでクロージャを記述する場合に限って、
先に閉じかっこ「)」を入れて関数パラメータの定義を終了させ、その直後に「{~}」を書くことで、
最終パラメータのクロージャを記述することができるようになっています。
一方、入力パラメータ形式通りにパラメータ内に記述するクロージャは、インラインクロージャと呼ばれます。
後置クロージャもインラインクロージャも書き方が違うだけで意味は同じです。
以下のサイトが参考になると思います。
http://swiftrithm.com/closures-trailing-closures/

投稿日時 - 2016-08-24 01:32:37

補足

後置クロージャを普通にしたら
{
image, info in
//ここでUIImageを取得します。
self.photoImageView.image = image
print("UIImage get!");
}
は、下記と同じということでいいのでしょうか?

resultHandler:{(image,info)->Void in
//ここでUIImageを取得します。
self.photoImageView.image = image
print("UIImage get!");
})

resultHandlerは書く必要はないのでしょうか?
引数
asset as! PHAsset
targetSize: CGSize(width: 320, height: 320)
contentMode: .AspectFill
options: nil
は理解できるのですが、
クロージャの引数のimage, infoがどこと関係してるのかがよく分かりません。
imageはUIImageを定義しておくのでしょうか?
infoは何を意味していますか?
教えてください。よろしくお願いします。

投稿日時 - 2016-08-26 06:01:42

お礼

丁寧な回答ありがとうございます。
クロージャがについて以前にも調べたことがあったのですが、理解しきれず、引数のなかで処理した値を使うってことかと思ってます。なの後置クロージャなどは全く理解できてませんでした。
追加の質問よろしくお願いします。

投稿日時 - 2016-08-26 05:56:24

ANo.1

前回の回答は、「requestImageForAssetでPHAssetからUIImageを作る方法を理解しているのであれば」という前提で回答しましたが、それを理解していないなら、

http://swift-salaryman.com/phasset.php

とかを参考にして、まずはPHAssetからUIImageを取得する方法をマスターしてください。
それがマスターできれば、使い方は似たようなものです。

投稿日時 - 2016-08-21 16:16:09

補足

リファレンスには
requestImageForAsset(_ asset: PHAsset,
targetSize targetSize: CGSize,
contentMode contentMode: PHImageContentMode,
options options: PHImageRequestOptions?,
resultHandler resultHandler: (UIImage?,
[NSObject : AnyObject]?) -> Void) -> PHImageRequestID

とあります。引数にある

resultHandler resultHandler: (UIImage?,
[NSObject : AnyObject]?) -> Void)

この部分はどういう意味ですか?
戻り値のPHImageRequestIDはどんな値なのでしょうか?
教えていただいたサイトの以下の部分にないのですが必要ではないのでしょうか?

phimgr.requestImageForAsset(asset as! PHAsset,
targetSize: CGSize(width: 320, height: 320),
contentMode: .AspectFill, options: nil) {
image, info in
//ここでUIImageを取得します。
self.photoImageView.image = image
print("UIImage get!");
}

image, info inの部分の意味はどういう意味でしょうか?(クロージャー?)
教えてください。よろしくお願いします。分からないことが多くてすみません。

投稿日時 - 2016-08-23 08:25:32

お礼

回答ありがとうございます
requestImageForAssetでPHAssetからUIImageを取得する方法を十分理解できていませんでした。
今回教えていただいたサイトを参考にUIImageを取得することはできたのですが、appleのリファレンスとの違いを教えていただきたく補足コメントに質問させてください。

投稿日時 - 2016-08-23 08:05:36

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-