UIActivityIndi​​catorView 在异步任务期间未显示

UIActivityIndicatorView not showing for duration of async task

我正在 iOS 开发一个应用程序,其中我需要开始旋转 UIActivityIndi​​catorView,将图像上传到服务器,上传完成后,停止旋转 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() 方法以规避此问题,但在 UIActivityIndi​​catorView 文档中找不到关于 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