2014-11-30 6 views
0

PHAsset에서 이미지를 얻으려는 "열거"를 이해하려고 노력합니다. 이것은 책의 샘플 코드로, 누구든지 사용할 수 있습니다. 나는 println을 추가하여 루프로 표시되었지만 결국 결과를 반환한다는 것을 놀라게했다. 1,2,3,4 대신이 코드의 결과로 줄 번호 2가 마지막으로 나오는 이유는 무엇입니까? 누구든지 설명 할 수 있다면 고맙겠습니다. 여기에 소스 코드를 resultPHAsset에서 이미지를 가져올 때 열거 방법을 설명합니다.? (스위프트)

그리고

enumerateObjectsUsingBlock

: 기본적으로 비동기 적으로 실행하고 resultHandler는 주 스레드에서 대기

// 
// ViewController.swift 
// Searching for and Retrieving Images and Videos 
// 
// Created by Vandad Nahavandipoor on 7/10/14. 
// Copyright (c) 2014 Pixolity Ltd. All rights reserved. 
// 
// These example codes are written for O'Reilly's iOS 8 Swift Programming Cookbook 
// If you use these solutions in your apps, you can give attribution to 
// Vandad Nahavandipoor for his work. Feel free to visit my blog 
// at http://vandadnp.wordpress.com for daily tips and tricks in Swift 
// and Objective-C and various other programming languages. 
// 
// You can purchase "iOS 8 Swift Programming Cookbook" from 
// the following URL: 
// http://shop.oreilly.com/product/0636920034254.do 
// If you have any questions, you can contact me directly 
// at [email protected] 
// Similarly, if you find an error in these sample codes, simply 
// report them to O'Reilly at the following URL: 
// http://www.oreilly.com/catalog/errata.csp?isbn=0636920034254 

import UIKit 
import Photos 

class ViewController: UIViewController { 

/* Just a little method to help us display alert dialogs to the user */ 
/* But once it's get ok from the device, the message will never shown up again !*/ 

func displayAlertWithTitle(title: String, message: String){ 
    let controller = UIAlertController(title: title, 
     message: message, 
     preferredStyle: .Alert) 

    controller.addAction(UIAlertAction(title: "OK", 
     style: .Default, 
     handler: nil)) 

    presentViewController(controller, animated: true, completion: nil) 

} 

override func viewDidAppear(animated: Bool) { 

    super.viewDidAppear(animated) 

    PHPhotoLibrary.requestAuthorization{ 
     [weak self](status: PHAuthorizationStatus) in 

     dispatch_async(dispatch_get_main_queue(), { 

      switch status{ 
      case .Authorized: 
       self!.retrieveImage() 
      default: 
       self!.displayAlertWithTitle("Access", 
        message: "I could not access the photo library") 
      } 
     }) 

    } 

} 

func retrieveImage() { 
    super.viewDidLoad() 

    /* Retrieve the items in order of modification date, ascending */ 
    let options = PHFetchOptions() 
    options.sortDescriptors = [NSSortDescriptor(key: "modificationDate", 
     ascending: true)] 

    /* Then get an object of type PHFetchResult that will contain 
    all our image assets */ 
    let assetResults = PHAsset.fetchAssetsWithMediaType(.Image, 
     options: options) 

    if assetResults == nil{ 
     println("Found no results") 
     return 
    } else { 
     println("Found \(assetResults.count) results") 
    } 

    let imageManager = PHCachingImageManager() 

    assetResults.enumerateObjectsUsingBlock{(object: AnyObject!, 
     count: Int, 
     stop: UnsafeMutablePointer<ObjCBool>) in 

     if object is PHAsset{How 
      let asset = object as PHAsset 
      println("Inside If object is PHAsset, This is number 1") 

      let imageSize = CGSize(width: asset.pixelWidth, 
       height: asset.pixelHeight) 

      /* For faster performance, and maybe degraded image */ 
      let options = PHImageRequestOptions() 
      options.deliveryMode = .FastFormat 

      imageManager.requestImageForAsset(asset, 
       targetSize: imageSize, 
       contentMode: .AspectFill, 
       options: options, 
       resultHandler: {(image: UIImage!, 
        info: [NSObject : AnyObject]!) in 

        /* The image is now available to us */ 

        println("enum for image, This is number 2") 


      }) 

      println("Inside If object is PHAsset, This is number 3") 
     } 
     println("Outside If object is PHAsset, This is number 4") 

    } 

    } 

} 

답변

1

requestImageForAsset 때문입니다. 이러한 열거 된 결과 핸들러는 열거가 완료 될 때까지 실행되지 않습니다.

+0

두 가지 이유가 있습니다. 그러나 결과 핸들러가 열거가 완료 될 때까지 실행되지 않는다는 단 한 가지 이유 때문에 내가 대체 한 requestImageForAsset 함수는 위의 동일한 순서로 나와야 함을 의미합니까? 또는 기본적으로 비동기 적이어야합니다. 확인해주세요. Tk –

+0

'options.synchronous = true'를 설정하여 동기식으로 실행하게하고 기대하는 순서를 얻을 수 있습니다. –

+0

@ Swipesight.I 테스트는 options.synchronous로 실행하고 여러분이 말한대로 작동했습니다. 큰. –