본문 바로가기
Swift

Sync, Async, Task 방식으로 이미지 로딩하기

by 루에 2015. 10. 28.
반응형

세 가지 방법 중 애플이 권장하는 방법은 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


반응형

댓글