2017-02-05 22 views
1

私は奇妙な行動が発生しました:画像読み込み中(スウィフト)

アンimagePickerはPHAssetを返し、私は次の操作を行うと、データから画像をImageViewのを提示するために管理します。

asset.requestContentEditingInput(with: PHContentEditingInputRequestOptions()) { (input, _) in 
    let url = input?.fullSizeImageURL 

    let imgV = UIImageView() 

    let test_url = URL(string: (url?.absoluteString)!) 

    print("><><><^^^><><>\(test_url)") 
    //prints: ><><><^^^><><>Optional(file:///var/mobile/Media/DCIM/107APPLE/IMG_7242.JPG) 
    let data = NSData(contentsOf: test_url! as URL) 
    imgV.image = UIImage(data: data! as Data) 
    imgV.backgroundColor = UIColor.cyan 

    att.imageLocalURL = url?.absoluteString//// saving the string to use in the other class 

    imgV.frame = CGRect(x: 0, y: 0, width: 100, height: 100) 

    self.view.addSubview(imgV) /// just to test that the file exists and can produce an image 

は、しかし、私は別のクラスでは、次の手順を実行したとき:

if((NSURL(string: self.attachment.imageLocalURL!) as URL!).isFileURL)// checking if is Local URL 
    { 


     let test_url = URL(string: self.attachment.imageLocalURL!) // reading the value stored from before 
     print("><><><^^^><><>\(test_url)") 
     //prints :><><><^^^><><>Optional(file:///var/mobile/Media/DCIM/107APPLE/IMG_7242.JPG) 
     let data = NSData(contentsOf: test_url! as URL) 
     imageView.image = UIImage(data: data! as Data) 

    } 

データがnilであります!私は間違って何をしていますか?URLの文字列はどちらの場合も同じです!

+0

を保持しますが、ブレークポイントをしようとすると、ステップ・バイ・ステップ、それは予期しない結果を生成する見ましたか? – d00dle

+0

クラスA:url_a - > string_a - > data - > imageですが、クラスB:string_a - > data - > nil、つまり予期しない動作です。 –

答えて

0

PHAssetオブジェクトには、PHImageManagerクラスを介してアクセスする必要があります。あなたが同期した画像をロードしたい場合、私はあなたがこのような何かをお勧めします。

func getImage(assetUrl: URL) -> UIImage? { 
     let asset = PHAsset.fetchAssets(withALAssetURLs: [assetUrl], options: nil) 

     guard let result = asset.firstObject else { 
      return nil 
     } 
     var assetImage: UIImage? 
     let options = PHImageRequestOptions() 
     options.isSynchronous = true 
     PHImageManager.default().requestImage(for: result, targetSize: UIScreen.main.bounds.size, contentMode: PHImageContentMode.aspectFill, options: options) { image, info in 
      assetImage = image 
     } 

     return assetImage 
    } 

あなたもPHAssetのURLから直接画像をロードするためにUIImageView拡張を書くことができます。

0

VAR画像:NSMutableArrayの= NSMutableArrayの()//フェッチ画像に

func fetchPhotos() 
{ 
    images = NSMutableArray() 
    //totalImageCountNeeded = 3 
    self.fetchPhotoAtIndexFromEnd(0) 
} 

func fetchPhotoAtIndexFromEnd(index:Int) 
{ 
    let status : PHAuthorizationStatus = PHPhotoLibrary.authorizationStatus() 
    if status == PHAuthorizationStatus.Authorized 
    { 
    let imgManager = PHImageManager.defaultManager() 
    let requestOptions = PHImageRequestOptions() 
    requestOptions.synchronous = true 

    let fetchOptions = PHFetchOptions() 
    fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending: true)] 

    if let fetchResult: PHFetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions) 
    { 
     if fetchResult.count > 0 
     { 
       imgManager.requestImageForAsset(fetchResult.objectAtIndex(fetchResult.count - 1 - index) as! PHAsset, targetSize: CGSizeMake(self.img_CollectionL.frame.size.height/3, self.img_CollectionL.frame.size.width/3), contentMode: PHImageContentMode.AspectFill, options: requestOptions, resultHandler: { (image, _) in 
       //self.images.addObject(image!) 
       if image != nil 
       { 
        self.images.addObject(image!) 
       } 
       if index + 1 < fetchResult.count && self.images.count < 20 //self.totalImageCountNeeded 
       { 
        self.fetchPhotoAtIndexFromEnd(index + 1) 
       } 
       else 
       { 
       } 
      }) 
      self.img_CollectionL.reloadData() 

     } 
    } 
    } 
} 
関連する問題