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

时间:2014-08-01 23:33:11

标签: 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()
}

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

我在模拟器中运行进行测试。

2 个答案:

答案 0 :(得分:7)

您要在newImageView上添加secondary thread。所有用户界面都必须在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)
    }
} 

答案 1 :(得分:0)

您需要在主线程上运行UIImage以使其快速运行。

我相信您的图像是GUI的一部分,因为您需要快速使用它!因此它应该在线程上。

尝试一下:

          DispatchQueue.main.sync {
          image = UIImage(data: imageData)
          let imageView = UIImageView(image: image!)
          imageView.frame = self.view.frame
          self.view.addSubview(imageView)
          self.view.bringSubview(toFront: imageView)
        }