AssetsLibraryの置き換えと言われても
AssetsLibraryを触ったことがないのに(_)
iOS9からは非推奨となってしまいPhotos Frameworkを使えと警告されてとりあえず基本的なところから理解するためのメモ書きです。
やりたいこと
他のアプリケーションをUIDocumentInteractionControllerで呼び出して、戻ってきたら追加された画像を取得したい。
・アルバムから画像の一覧を取得
・監視を開始/終了
・画像追加を検知したときの処理
・UIImageの取得
#コード
ViewController.swift
import UIKit
import Photos
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, PHPhotoLibraryChangeObserver {
var pathArray:Array<String> = []
var imageArray:Array<UIImage> = []
@IBOutlet weak var ImageTable: UITableView!
@IBAction func onClickStart(sender: AnyObject) {
self.kanshiStart()
}
@IBAction func onClickEnd(sender: AnyObject){
self.kanshiEnd()
}
var fetch:PHFetchResult?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 0
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
if cell != nil{
cell = UITableViewCell(style: .Default, reuseIdentifier: "cell")
}
return cell!
}
func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
//code
}
//監視開始
func kanshiStart(){
//アルバムに関係なくすべての画像を取得
//プロパティに対比させる
self.fetch = PHAsset.fetchAssetsWithMediaType(.image, options: nil)
//画像変更の監視にオブザーバとして登録
PHPhotoLibrary.sharedPhotoLibrary().registerChangeObserver(self)
}
//監視開始
func kanshiEnd(){
//監視を終了するときはこう
PHPhotoLibrary.sharedPhotoLibrary().unregisterChangeObserver(self)
}
//画像変更時に呼ぶデリゲート
func photoLibraryDidChange(changeInstance: PHChange) {
//非同期で実行
//非同期でなくてもよいならその必要はない
dispatch_async(dispatch_get_main_queue()) { () -> Void in
//対比していたPHFetchResultを渡して、変更内容を取得
//変更がない場合はnil
if let changeFetchDetail = changeInstance.changeDetailsForFetchResult(self.fetch!) {
//insertedObjectsには追加されたオブジェクトが入っている。
//オブジェクトの型はFetchしたときの型で決まる。
//今回はPHAsset。PHAssetCollectionにしたいときはself.fetchの取得時にPHAssetCollectionのメンバメソッドでFetchする
let insAsset:[PHAsset] = changeFetchDetail.insertedObjects as! [PHAsset]
for(var i = 0;i < insAsset.count;i++){
PHImageManager.defaultManager().requestImageForAsset(insAsset[i], targetSize: CGSizeMake(100.0,100.0), contentMode: PHImageContentMode.Default, options: nil
, resultHandler: { (image:UIImage?, info:NSDictionary?) -> Void in
//UIImageが取れる
})
}
//変更された内容が知りたいときはchangedObjectとかで
}
}
}
}
insertedObjectになにの型で入っているのかがサッパリわからなくてドツボに嵌りました。
Fetchしたときのクラスに依存しているんですね。
外部アプリから戻った後はappDelegateのapplicationDidBecomeActive内で監視解除を呼び出します。