我正在使用iOS中的应用程序,我需要开始旋转UIActivityIndicatorView,将图像上传到服务器,当上传完成后,停止旋转活动指示器。
我目前正在使用XCode 7 Beta并在iOS模拟器上测试iPhone 6和iPhone 5上的应用程序。我的问题是活动指示器在文件上传后不会立即结束,但有几个(~28秒)之后。我应该在哪里拨打电话让它结束?
我有一个@IBOutlet函数附加到我用来启动进程的按钮,它包含startAnimating()函数,并调用包含对uploadImage的调用的dispatch_async方法,该方法包含signal,wait和stopAnimating ()函数。
请注意
let semaphore = dispatch_semaphore_create(0)
let priority = DISPATCH_QUEUE_PRIORITY_HIGH
定义在我班级的顶部。
@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()
}
还有几种其他方法可以移动我的代码,试图让活动指示器在图像上传期间显示,然后立即退出。在某些情况下,在程序执行期间,微调器根本不会出现。我阅读了this帖子和this问题,并将我的dispatch_semaphore_wait和stopAnimating()迁移到uploadImage()方法以规避这一点,但无法在UIActivityIndicatorView文档中找到有关UI的足够信息更新以了解更新它的任何其他方式,但我相信这可能是问题的核心。
我需要的只是让spinner在上传过程开始之前启动(dataTaskWithRequest),一旦成功或失败就结束。我做错了什么?
答案 0 :(得分:2)
您可以直接调度到异步任务中的主线程,而不是使用信号量,
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