Как обновить UIImageView после загрузки изображения в Playground

Я играю на детской площадке, пытаясь лучше понять загрузку и настройку асинхронных изображений.

Я использую NSURLSession DataTask, и у меня есть отличные данные об изображении - я могу подтвердить это с помощью Quick Look на Playground.

Я также использую платформу XCPlayground, чтобы установить страницу как нуждающуюся в неопределенном выполнении, а liveView для currentPage является целевым imageView.

Тем не менее, что-то по-прежнему не хватает, и представление в реальном времени не обновляется должным образом. Есть идеи? То, что я хочу сделать, сводится к следующему коду. Вы можете увидеть состояние детской площадки на скриншоте:

import UIKit
import XCPlayground

XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

let someImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 256, height: 256))

let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
session.dataTaskWithRequest(NSURLRequest(URL: NSURL(string: "http://www.stridesapp.com/strides-icon.png")!))
    {
        data, response, error in
        if let data = data
        {
            print(data)
            someImageView.image = UIImage(data: data)
        }
    }.resume()

XCPlaygroundPage.currentPage.liveView = someImageView

Состояние детской площадки

1 ответ

Решение

Учитывая, что NSURLSession не будет запускать обработчик завершения в главной очереди, вы должны самостоятельно отправить обновление представления в основную очередь:

import UIKit
import XCPlayground

XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

let someImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 256, height: 256))

let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
session.dataTaskWithRequest(NSURLRequest(URL: NSURL(string: "http://www.stridesapp.com/strides-icon.png")!)) { data, response, error in
        if let data = data {
            print(data)
            dispatch_async(dispatch_get_main_queue()) {
                someImageView.image = UIImage(data: data)
            }
        }
    }.resume()

XCPlaygroundPage.currentPage.liveView = someImageView

Таким образом:

прямая трансляция

Другие вопросы по тегам