Swift:为什么添加图像子视图需要这么长时间?

use*_*185 2 ios swift

我在Swift中编写了一个简单的表视图应用程序.我试图将图像传递给我的本地节点服务器,并让服务器发回这个接收到的图像,但没有改变它,并将其显示在iPhone屏幕上.嵌入在每个单元格中的是一个启动此帖子/响应处理的按钮.该按钮调用以下功能:

func uploadImage() {
    /* Encode UIImage to be passed to server */
    let image = UIImage(named: "myImage.png")
    let imageData = UIImageJPEGRepresentation(image, 1.0)
    let base64String = imageData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.fromRaw(0)!)
    var params = ["username":"myUsername", "image": base64String ] as Dictionary

    /* Set up request */
    let url = NSURL(string: "http://localhost:3000/postRequestHere")
    var request = NSMutableURLRequest(URL: url)
    var session = NSURLSession.sharedSession()
    request.HTTPMethod = "POST"
    var err: NSError?
    request.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err)
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")    

    var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
        var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
        var err: NSError?
        var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as NSDictionary

        if(err) {
            println(err!.localizedDescription)
        }
        else {
            /* Server returns JSON as follows: {"success":imageData} */
            var success = json["success"] as NSString
            let successData = NSData(base64EncodedString: success, options: NSDataBase64DecodingOptions.fromMask(0))

            /* Begin Reference A */
            let returnImage = UIImage(data: successData)
            let newImageView = UIImageView(image: returnImage)
            newImageView.frame = self.view.bounds
            self.view.addSubview(newImageView)
            self.view.bringSubviewToFront(newImageView)
            /* End Reference A */
        }
    })

    task.resume()
}
Run Code Online (Sandbox Code Playgroud)

我得到的图像是正确的,一切都按预期工作.但是,显示图像大约需要20秒(来自参考文献A).我甚至在参考A中使用了本地图像,没有使用从服务器返回的数据,这仍然需要相同的时间.如果我将参考A放在任务之外,使用本地图像,则立即显示.

我通过在模拟器中运行来测试.

cod*_*ter 7

您正在添加newImageView.secondary thread所有UI必须更新.So main thread调用addSubview主线程.用此替换您的代码

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
    dispatch_async(dispatch_get_main_queue()) {
        // update UI on the main thread
        let newImageView = UIImageView(image: returnImage)
        newImageView.frame = self.view.bounds
        self.view.addSubview(newImageView)
        self.view.bringSubviewToFront(newImageView)
    }
} 
Run Code Online (Sandbox Code Playgroud)