iOS-UIActivityIndicatorView未停止
我正在函数中启动UIActivityIndicatorView,并希望在成功时停止它,因为某些原因,它没有发生:iOS-UIActivityIndicatorView未停止,ios,swift,uiactivityindicatorview,Ios,Swift,Uiactivityindicatorview,我正在函数中启动UIActivityIndicatorView,并希望在成功时停止它,因为某些原因,它没有发生: func imageCaller(url: String , success: @escaping (UIImage) -> Void, failure: @escaping () -> Void) { self.imageLoaderIndicator.startAnimating() let handler = AuthenticateHandler
func imageCaller(url: String , success: @escaping (UIImage) -> Void, failure: @escaping () -> Void) {
self.imageLoaderIndicator.startAnimating()
let handler = AuthenticateHandler()
self.urlSession = URLSession(configuration: URLSessionConfiguration.default, delegate: handler, delegateQueue: OperationQueue.main)
self.imageThumbnailTask = urlSession?.dataTask(with: URL(string:url)!) { data, res, err in
if err != nil {
guard let dataResponse = data,
err == nil else {
print("error from dataResponse:\(err?.localizedDescription ?? "Response Error")")
return
}
if let imageData = data {
if let image = UIImage(data: imageData) {
success(image)
}
}
}
self.imageThumbnailTask?.resume()
}
上面的代码是网络调用
这是调用的方法:
func imageThumbnailcall() {
self.imageCaller( url: self.isShowingThermal ? self.thermalUrl : self.visualUrl, success: { (image) in
self.imageLoaderIndicator.stopAnimating()
self.backGroundImageView.image = image
if self.isInVC {
self.imageThumbnailcall()
}
}) {
self.imageLoaderIndicator.stopAnimating()
}
}
同样在故事板中,我选中了“停止时隐藏”,并尝试用DispatchQueue.main.async{}Try包装它
func imageThumbnailcall() {
self.imageCaller( url: self.isShowingThermal ? self.thermalUrl : self.visualUrl, success: { (image) in
self.imageLoaderIndicator.stopAnimating()
self.backGroundImageView.image = image
if self.isInVC {
self.imageThumbnailcall()
}
}) {
self.imageLoaderIndicator.stopAnimating()
}
}
函数中有许多分支既不调用
成功
块,也不调用失败
块,还需要停止失败
回调中的活动指示器。您还应该确保将所有与UI相关的活动分派到主线程
func imageCaller(url: String , success: @escaping (UIImage) -> Void, failure: @escaping () -> Void) {
self.imageLoaderIndicator.startAnimating()
let handler = AuthenticateHandler()
self.urlSession = URLSession(configuration: URLSessionConfiguration.default, delegate: handler, delegateQueue: OperationQueue.main)
self.imageThumbnailTask = urlSession?.dataTask(with: URL(string:url)!) { data, res, err in
if err != nil {
guard let dataResponse = data, err == nil else {
print("error from dataResponse:\(err?.localizedDescription ?? "Response Error")")
failure()
return
}
do{
//here dataResponse received from a network request
let jsonResponse = try JSONSerialization.jsonObject(with: dataResponse, options: [])
print("erro after parsing data:\(jsonResponse)") //Response result
failure()
} catch let parsingError {
failure()
print("Error", parsingError)
}
} else if let imageData = data, let image = UIImage(data: imageData) {
success(image)
} else {
failure()
}
}
self.imageThumbnailTask?.resume()
}
然后从failure
块调用stop animating
:
func imageThumbnailcall() {
self.imageCaller(url: self.isShowingThermal ? self.thermalUrl : self.visualUrl, success: { image in
DispatchQueue.main.async{
self.imageLoaderIndicator.stopAnimating()
self.backGroundImageView.image = image
}
if self.isInVC {
self.imageThumbnailcall()
}
}, failure: { _ in
DispatchQueue.main.async{
self.imageLoaderIndicator.stopAnimating()
}
})
}
不确定什么是
isInVC
或者它是如何设置的,但是您根据它的值再次调用相同的方法,这可能会导致imageThumbnailcall
从成功完成处理程序调用自己的无限循环。调用URLSession.dataTask
在后台队列中,所以
DispatchQueue.main.async {
self.imageLoaderIndicator.stopAnimating()
}
并且确保成功和失败都要处理你需要在成功和失败的时候都停止它。您需要稍微重构代码。您确定调用成功吗?如果没有,您就没有一个故障块,图像加载程序将停止使用该故障块进行动画制作。@rmaddy我知道重构,但即使我将其放入故障中也没有帮助。@AdamFallon是的,我确定。我调试了它并在线路上用断点停止。。。但是没有停止。正如我提到的DispatchQueue.main.async{}递归调用self.imageThumbnailcall可能就是这个原因,如果self.isInVC{self.imageThumbnailcall()}isInVC中断循环。正如我提到的,我尝试了您的建议:DispatchQueue.main.async{}和失败,但仍然不是stopping@ironRoei你真的看过我的代码了吗
DispatchQueue.main.async
只是我对代码所做更改的一小部分,这并不能解决眼前的问题,这只是为了解决从后台线程修改UI时遇到的下一个问题。我确实根据您的代码进行了修改,但仍然没有success@ironRoei您是否使用了调试器来逐步检查代码并查看代码实际采用了哪个分支?self.backGroundImageView.image
实际设置了还是没有执行?好的,所以我修改了你的行:如果让imageData=data,让imageData=UIImage(data:imageData){success(image)}或者{failure()},它就工作了。首先谢谢,其次我想了解一下