我在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放在任务之外,使用本地图像,则会立即显示。
我在模拟器中运行进行测试。
答案 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)
}