6. serial & concurrent queue
https://developer.apple.com/library/ios/documentation/General/Conceptual/
ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html
7. demovar number1 = 0
var number2 = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let queue = dispatch_queue_create("Queue", DISPATCH_QUEUE_SERIAL)
dispatch_async(queue, { () -> Void in
for i in 1...10 {
self.number1++
NSThread.sleepForTimeInterval(0.1)
if i == 10 {
println("number1 (self.number1) number2 (self.number2)")
}
}
})
println("dispatch_async1")
dispatch_async(queue, { () -> Void in
for i in 1...10 {
self.number2++
}
})
println("dispatch_async2")
}
dispatch_async1
dispatch_async2
number1 10 number2 0
serial: FIFO
8. demovar number1 = 0
var number2 = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let queue = dispatch_queue_create("Queue", DISPATCH_QUEUE_CONCURRENT)
dispatch_async(queue, { () -> Void in
for i in 1...10 {
self.number1++
NSThread.sleepForTimeInterval(0.1)
if i == 10 {
println("number1 (self.number1) number2 (self.number2)")
}
}
})
println("dispatch_async1")
dispatch_async(queue, { () -> Void in
for i in 1...10 {
self.number2++
}
})
println("dispatch_async2")
}
dispatch_async1
dispatch_async2
number1 10 number2 10
9. demovar number1 = 0
var number2 = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let queue = dispatch_queue_create("Queue", DISPATCH_QUEUE_SERIAL)
dispatch_sync(queue, { () -> Void in
for i in 1...10 {
self.number1++
NSThread.sleepForTimeInterval(0.1)
if i == 10 {
println("number1 (self.number1) number2 (self.number2)")
}
}
})
println("dispatch_sync1")
dispatch_sync(queue, { () -> Void in
for i in 1...10 {
self.number2++
}
})
println("dispatch_sync2")
}
number1 10 number2 0
dispatch_sync1
dispatch_sync2
10. demovar number1 = 0
var number2 = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let queue = dispatch_queue_create("Queue", DISPATCH_QUEUE_CONCURRENT)
dispatch_sync(queue, { () -> Void in
for i in 1...10 {
self.number1++
NSThread.sleepForTimeInterval(0.1)
if i == 10 {
println("number1 (self.number1) number2 (self.number2)")
}
}
})
println("dispatch_sync1")
dispatch_sync(queue, { () -> Void in
for i in 1...10 {
self.number2++
}
})
println("dispatch_sync2")
}
number1 10 number2 0
dispatch_sync1
dispatch_sync2
13. NSURLSession
func testDownload() {
let session = NSURLSession(configuration:
NSURLSessionConfiguration.defaultSessionConfiguration())
if let url = NSURL(string: "http://res.cloudinary.com/hrscywv4p/image/upload/
c_limit,f_auto,h_3000,q_80,w_1200/v1/271374/http_s3.amazonaws.com_feather-files-aviary-prod-
us-east-1_f5da8ea5e_2015-03-12_723490bbf79e44a788f5cd2516fefd46_myvzle.jpg") {
let request = NSURLRequest(URL: url)
let task = session.downloadTaskWithRequest(request, completionHandler:
{ (localUrl, response, err) -> Void in
let data = NSData(contentsOfURL: localUrl)
let image = UIImage(data: data!)
let imageView = UIImageView(image: image)
self.view.addSubview(imageView)
println("add image")
})
task.resume()
}
}
圖⽚片過⼀一段時間才出現
14. NSURLSession
func testDownload() {
let session = NSURLSession(configuration:
NSURLSessionConfiguration.defaultSessionConfiguration())
if let url = NSURL(string: "http://res.cloudinary.com/hrscywv4p/image/upload/
c_limit,f_auto,h_3000,q_80,w_1200/v1/271374/http_s3.amazonaws.com_feather-files-aviary-prod-
us-east-1_f5da8ea5e_2015-03-12_723490bbf79e44a788f5cd2516fefd46_myvzle.jpg") {
let request = NSURLRequest(URL: url)
let task = session.downloadTaskWithRequest(request, completionHandler:
{ (localUrl, response, err) -> Void in
let data = NSData(contentsOfURL: localUrl)
let image = UIImage(data: data!)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
let imageView = UIImageView(image: image)
self.view.addSubview(imageView)
})
})
task.resume()
}
}
15. 建⽴立session
let session = NSURLSession.sharedSession()
let session = NSURLSession(configuration:
NSURLSessionConfiguration.defaultSessionConfiguration())
預設會將抓到的資料存在disk,App重新啟動還會存在
若是抓取size太⼤大的資料不會儲存在disk
16. 建⽴立task
let task = session.dataTaskWithURL(url, completionHandler: { (data, response, err) -> Void in
let image = UIImage(data: data!)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
let imageView = UIImageView(image: image)
self.view.addSubview(imageView)
})
})
let task = session.downloadTaskWithRequest(request, completionHandler: { (localUrl,
response, err) -> Void in
let data = NSData(contentsOfURL: localUrl)
let image = UIImage(data: data!)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
let imageView = UIImageView(image: image)
self.view.addSubview(imageView)
})
})
17. private func fetchImage()
{
if let url = imageURL {
spinner?.startAnimating()
let qos = Int(QOS_CLASS_USER_INITIATED.value)
dispatch_async(dispatch_get_global_queue(qos, 0)) { () -> Void in
let imageData = NSData(contentsOfURL: url) // this blocks the thread it is on
dispatch_async(dispatch_get_main_queue()) {
// only do something with this image
// if the url we fetched is the current imageURL we want
// (that might have changed while we were off fetching this one)
if url == self.imageURL { // the variable "url" is capture from above
if imageData != nil {
// this might be a waste of time if our MVC is out of action now
// which it might be if someone hit the Back button
// or otherwise removed us from split view or navigation
controller
// while we were off fetching the image
self.image = UIImage(data: imageData!)
} else {
self.image = nil
}
}
}
}
}
}
closure裡要⽤用self.image,不能只⽤用image
if url == self.imageURL : 判斷是否是⺫⽬目前要顯⽰示的圖⽚片
⽤用weak , unowned 設定self ?