반응형
세 가지 방법 중 애플이 권장하는 방법은 Task방식이다. 어차피 기본적으로 싱크로 이미지를 로딩할 일은 없겠지만.
task도 기본적으로 비동기이며, Async와 비교해서 장점은.. 음, 글쎄 더 빠른지는 자세히 테스트 해보지 않아서 모르겠다.
하지만 액션 구역이 분할되있기 때문에 아마 동작 제어가 더 낫지 않을까...
안드로이드의 AsyncTask와 가장 비슷한 형태라고 보인다.
코드는 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | import UIKit class ViewController: UIViewController { @IBOutlet weak var webView: UIImageView! let urlStr = "image address for URL" @IBOutlet weak var indicator: UIActivityIndicatorView! @IBAction func sync(sender: AnyObject) { print("sync") startIndicator() let url = NSURL(string: urlStr)! let request = NSURLRequest(URL: url) var response : NSURLResponse? do { let data = try NSURLConnection.sendSynchronousRequest(request, returningResponse: &response) let image = UIImage(data: data) webView.image = image }catch { } stopIndicator() } @IBAction func async(sender: AnyObject) { print("async") startIndicator() let url = NSURL(string: urlStr) let request = NSURLRequest(URL: url!) let queue = NSOperationQueue.mainQueue() NSURLConnection.sendAsynchronousRequest(request, queue: queue) { (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in if nil == error { print(error) return } let image = UIImage(data: data!) self.webView.image = image self.stopIndicator() } } @IBAction func task(sender: AnyObject) { let url = NSURL(string: urlStr)! let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) let task = session.dataTaskWithURL(url) { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in if nil != error { print("Error : \(error)") return } print("isMainThread ? \(NSThread.isMainThread()) data size : \(data!.length)") NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in let image = UIImage(data: data!) self.webView.image = image self.stopIndicator() }) } startIndicator() task.resume() } func startIndicator(){ indicator.startAnimating() } func stopIndicator(){ indicator.stopAnimating() } } | cs |
반응형
댓글