2016-10-06 21 views
20

Tôi có một chức năng mà đi như thế này:Chạy một sợi nền trên Swift 3

fileprivate func setupImageViewWithURL(url: URL) { 
    var image: UIImage? = nil 
    do { 
     try image = UIImage(data: Data(contentsOf: url))! 
    } catch is NSError { 
     print("Failed") 
    } 

    image = self.imageWithImage(sourceImage: image!, scaledToWidth: UIScreen.main.bounds.size.width) 
    self.imageImageView.image = image 
    self.imageImageView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: (image?.size.height)!) 
} 

Tôi muốn chạy nó trên một Backgroundthread.

Tôi đã thử các phương pháp GDC của Swift2 nhưng không hoạt động.

Có bất kỳ điều gì đã thay đổi về chủ đề chuỗi trong Swift3 không?

Cảm ơn bạn!

+1

http://swiftable.io/2016/06/dispatch-queues-swift-3/ –

+0

@ New16 Tôi đã thử nó, nó thậm chí không tuân thủ –

+3

Có thể trùng lặp của [Làm thế nào để dispatch_sync, dispatch_async, dispatch_after, vv trong Swift 3?] (Http://stackoverflow.com/questions/37801370/ how-do-i-dispatch-sync-dispatch-async-dispatch-sau-etc-in-swift-3). –

Trả lời

51

Bạn có thể tải hình ảnh ở chế độ nền nhưng không thể thực hiện cập nhật giao diện người dùng trên chuỗi nền. Đó là lý do tại sao hàm phải chứa hai luồng.

func setupImageViewWithURL(url: URL) { 
    var image: UIImage? = nil 

    DispatchQueue.global().async { 
     do { 
      try image = UIImage(data: Data(contentsOf: url))! 
     } catch { 
      print("Failed") 
     } 
     DispatchQueue.main.async(execute: { 
      if image != nil { 
       image = self.imageWithImage(sourceImage: image!, scaledToWidth: UIScreen.main.bounds.size.width) 
       self.imageImageView.image = image 
       self.imageImageView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: (image?.size.height)!) 
      } 
     }) 
    } 
} 
+0

'ImageWithImage' là phương pháp cắt hình ảnh, nó có thể được thực hiện trên một chuỗi nền không? –

+0

@ FS.O6, tôi không nghĩ rằng đó là vấn đề. Bạn có thể kiểm tra nó. –

+0

Ok, tuyệt. Cảm ơn! –

0

DispatchQueue.global (qos: .background) .async {

}