我在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放在任务之外,使用本地图像,则立即显示.
我通过在模拟器中运行来测试.
您正在添加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)