UIActivityIndicatorView 在异步任务期间未显示
UIActivityIndicatorView not showing for duration of async task
我正在 iOS 开发一个应用程序,其中我需要开始旋转 UIActivityIndicatorView,将图像上传到服务器,上传完成后,停止旋转 activity指标。
我目前正在使用 XCode 7 Beta 并正在 iOS 模拟器上测试该应用程序作为 iPhone 6 和 iPhone 5。我的问题是activity 指示器不会在文件上传后立即结束,而是会在数次(~28 秒)后结束。我应该在哪里拨打电话才能结束?
我在用于启动进程的按钮上附加了一个@IBOutlet 函数,它包含 startAnimating() 函数,并调用一个 dispatch_async 方法,该方法包含对 uploadImage 的调用,其中包含signal、wait 和 stopAnimating() 函数。
注意
let semaphore = dispatch_semaphore_create(0)
let priority = DISPATCH_QUEUE_PRIORITY_HIGH
定义在我的class的顶部。
@IBAction func uploadButton(sender: AnyObject) {
self.activityIndicatorView.startAnimating()
dispatch_async(dispatch_get_global_queue(priority, 0)) {
self.uploadImage(self.myImageView.image!)
} // end dispatch_async
} // works with startAnimating() and stopAnimating() in async but not with uploadImage() in async
func uploadImage(image: UIImage) {
let request = self.createRequest(image)
let session : NSURLSession = NSURLSession.sharedSession()
let task : NSURLSessionTask = session.dataTaskWithRequest(request, completionHandler: {
(data, response, error) in
if error != nil {
print(error!.description)
} else {
let httpResponse: NSHTTPURLResponse = response as! NSHTTPURLResponse
if httpResponse.statusCode != 200 {
print(httpResponse.description)
} else {
print("Success! Status code == 200.")
dispatch_semaphore_signal(self.semaphore)
}
}
})! // end dataTaskWithResult
task.resume()
dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER)
self.activityIndicatorView.stopAnimating()
} // end uploadImage
这只是我的代码的一个版本,我已经用几种不同的方式移动了几件事。我试过这个:
@IBAction func uploadButton(sender: AnyObject) {
self.activityIndicatorView.startAnimating()
dispatch_async(dispatch_get_global_queue(priority, 0)) {
self.uploadImage(self.myImageView.image!)
dispatch_semaphore_signal(self.semaphore)
} // end dispatch_async
dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER)
self.activityIndicatorView.stopAnimating()
}
以及其他几种移动我的代码的方法,以尝试让 activity 指示器在图像上传期间显示,然后立即退出。在某些情况下,微调器在程序执行期间根本不出现。我阅读了 this post and this 问题并将我的 dispatch_semaphore_wait 和 stopAnimating() 迁移到 uploadImage() 方法以规避此问题,但在 UIActivityIndicatorView 文档中找不到关于 UI更新以了解任何其他更新方式,尽管我相信这可能是问题的核心。
我需要的只是让微调器在上传过程开始之前启动 (dataTaskWithRequest),并在上传过程成功或失败后结束。我做错了什么?
您可以不使用信号量,而是直接分派到异步任务中的主线程,
func uploadImage(image: UIImage) {
let request = self.createRequest(image)
let session : NSURLSession = NSURLSession.sharedSession()
let task : NSURLSessionTask = session.dataTaskWithRequest(request, completionHandler: {
(data, response, error) in
if error != nil {
print(error!.description)
} else {
let httpResponse: NSHTTPURLResponse = response as! NSHTTPURLResponse
if httpResponse.statusCode != 200 {
print(httpResponse.description)
} else {
print("Success! Status code == 200.")
}
}
// dispatch to main thread to stop activity indicator
dispatch_async(disptach_get_main_queue()) {
self.activityIndicatorView.stopAnimating()
}
})! // end dataTaskWithResult
task.resume()
} // end uploadImage
我正在 iOS 开发一个应用程序,其中我需要开始旋转 UIActivityIndicatorView,将图像上传到服务器,上传完成后,停止旋转 activity指标。
我目前正在使用 XCode 7 Beta 并正在 iOS 模拟器上测试该应用程序作为 iPhone 6 和 iPhone 5。我的问题是activity 指示器不会在文件上传后立即结束,而是会在数次(~28 秒)后结束。我应该在哪里拨打电话才能结束?
我在用于启动进程的按钮上附加了一个@IBOutlet 函数,它包含 startAnimating() 函数,并调用一个 dispatch_async 方法,该方法包含对 uploadImage 的调用,其中包含signal、wait 和 stopAnimating() 函数。
注意
let semaphore = dispatch_semaphore_create(0)
let priority = DISPATCH_QUEUE_PRIORITY_HIGH
定义在我的class的顶部。
@IBAction func uploadButton(sender: AnyObject) {
self.activityIndicatorView.startAnimating()
dispatch_async(dispatch_get_global_queue(priority, 0)) {
self.uploadImage(self.myImageView.image!)
} // end dispatch_async
} // works with startAnimating() and stopAnimating() in async but not with uploadImage() in async
func uploadImage(image: UIImage) {
let request = self.createRequest(image)
let session : NSURLSession = NSURLSession.sharedSession()
let task : NSURLSessionTask = session.dataTaskWithRequest(request, completionHandler: {
(data, response, error) in
if error != nil {
print(error!.description)
} else {
let httpResponse: NSHTTPURLResponse = response as! NSHTTPURLResponse
if httpResponse.statusCode != 200 {
print(httpResponse.description)
} else {
print("Success! Status code == 200.")
dispatch_semaphore_signal(self.semaphore)
}
}
})! // end dataTaskWithResult
task.resume()
dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER)
self.activityIndicatorView.stopAnimating()
} // end uploadImage
这只是我的代码的一个版本,我已经用几种不同的方式移动了几件事。我试过这个:
@IBAction func uploadButton(sender: AnyObject) {
self.activityIndicatorView.startAnimating()
dispatch_async(dispatch_get_global_queue(priority, 0)) {
self.uploadImage(self.myImageView.image!)
dispatch_semaphore_signal(self.semaphore)
} // end dispatch_async
dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER)
self.activityIndicatorView.stopAnimating()
}
以及其他几种移动我的代码的方法,以尝试让 activity 指示器在图像上传期间显示,然后立即退出。在某些情况下,微调器在程序执行期间根本不出现。我阅读了 this post and this 问题并将我的 dispatch_semaphore_wait 和 stopAnimating() 迁移到 uploadImage() 方法以规避此问题,但在 UIActivityIndicatorView 文档中找不到关于 UI更新以了解任何其他更新方式,尽管我相信这可能是问题的核心。
我需要的只是让微调器在上传过程开始之前启动 (dataTaskWithRequest),并在上传过程成功或失败后结束。我做错了什么?
您可以不使用信号量,而是直接分派到异步任务中的主线程,
func uploadImage(image: UIImage) {
let request = self.createRequest(image)
let session : NSURLSession = NSURLSession.sharedSession()
let task : NSURLSessionTask = session.dataTaskWithRequest(request, completionHandler: {
(data, response, error) in
if error != nil {
print(error!.description)
} else {
let httpResponse: NSHTTPURLResponse = response as! NSHTTPURLResponse
if httpResponse.statusCode != 200 {
print(httpResponse.description)
} else {
print("Success! Status code == 200.")
}
}
// dispatch to main thread to stop activity indicator
dispatch_async(disptach_get_main_queue()) {
self.activityIndicatorView.stopAnimating()
}
})! // end dataTaskWithResult
task.resume()
} // end uploadImage