0
PHAsset에서 이미지를 얻으려는 "열거"를 이해하려고 노력합니다. 이것은 책의 샘플 코드로, 누구든지 사용할 수 있습니다. 나는 println을 추가하여 루프로 표시되었지만 결국 결과를 반환한다는 것을 놀라게했다. 1,2,3,4 대신이 코드의 결과로 줄 번호 2가 마지막으로 나오는 이유는 무엇입니까? 누구든지 설명 할 수 있다면 고맙겠습니다. 여기에 소스 코드를 PHAsset에서 이미지를 가져올 때 열거 방법을 설명합니다.? (스위프트)
그리고
: 기본적으로 비동기 적으로 실행하고
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")
}
}
}
두 가지 이유가 있습니다. 그러나 결과 핸들러가 열거가 완료 될 때까지 실행되지 않는다는 단 한 가지 이유 때문에 내가 대체 한 requestImageForAsset 함수는 위의 동일한 순서로 나와야 함을 의미합니까? 또는 기본적으로 비동기 적이어야합니다. 확인해주세요. Tk –
'options.synchronous = true'를 설정하여 동기식으로 실행하게하고 기대하는 순서를 얻을 수 있습니다. –
@ Swipesight.I 테스트는 options.synchronous로 실행하고 여러분이 말한대로 작동했습니다. 큰. –