animateWithDuration 在 URLSession 中写入时调用时间过长
animateWithDuration call after a long time when it is written in URLSession
在 Swift 2.0 中,我使用网络 API 上传和下载一些数据。在调用 API 之前,我已经启动了一个 activity 指示器动画,并希望在 API 的响应到来时停止它。
但是,当我想在API响应后停止动画时,指示器在等待很长时间后停止。
这是我的代码:
let activityIndi = UIActivityIndicatorView(activityIndicatorStyle: .White)
activityIndi.startAnimating()
flagBtn.addSubview(activityIndi)
let urlString = NSURL(string: "URL")
NSURLSession.sharedSession().dataTaskWithURL(urlString!, completionHandler: { (data: NSData?, _, _) -> Void in
if data != nil {
do {
let jsonInfoDic = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as! [String:AnyObject]
if(jsonInfoDic["status"] as! Bool)
{
UIView.animateWithDuration(1.0, animations: {
activityIndi.stopAnimating()
}, completion:{ (finished: Bool) -> Void in
})
}
}
catch { print("Exception in parsing JSON.\n\nReason: \(error)") }
}
}).resume()
您需要在主线程上执行UI修改操作。由于 dataTaskWithURL:completionHandler:
的回调是在后台线程(NSURLSession
线程)上执行的,因此您必须按如下方式调度 UI 代码:
dispatch_async(dispatch_get_main_queue()) {
activityIndi.stopAnimating()
}
此外,我怀疑您不需要 UIView.animateWithDuration:completion:
,因为 stopAnimating
会自行执行动画。
在 Swift 2.0 中,我使用网络 API 上传和下载一些数据。在调用 API 之前,我已经启动了一个 activity 指示器动画,并希望在 API 的响应到来时停止它。
但是,当我想在API响应后停止动画时,指示器在等待很长时间后停止。
这是我的代码:
let activityIndi = UIActivityIndicatorView(activityIndicatorStyle: .White)
activityIndi.startAnimating()
flagBtn.addSubview(activityIndi)
let urlString = NSURL(string: "URL")
NSURLSession.sharedSession().dataTaskWithURL(urlString!, completionHandler: { (data: NSData?, _, _) -> Void in
if data != nil {
do {
let jsonInfoDic = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as! [String:AnyObject]
if(jsonInfoDic["status"] as! Bool)
{
UIView.animateWithDuration(1.0, animations: {
activityIndi.stopAnimating()
}, completion:{ (finished: Bool) -> Void in
})
}
}
catch { print("Exception in parsing JSON.\n\nReason: \(error)") }
}
}).resume()
您需要在主线程上执行UI修改操作。由于 dataTaskWithURL:completionHandler:
的回调是在后台线程(NSURLSession
线程)上执行的,因此您必须按如下方式调度 UI 代码:
dispatch_async(dispatch_get_main_queue()) {
activityIndi.stopAnimating()
}
此外,我怀疑您不需要 UIView.animateWithDuration:completion:
,因为 stopAnimating
会自行执行动画。