UIActivityIndi​​catorView未显示异步任务的持续时间

时间:2015-08-14 15:16:31

标签: ios swift asynchronous uiactivityindicatorview swift2

我正在使用iOS中的应用程序,我需要开始旋转UIActivityIndi​​catorView,将图像上传到服务器,当上传完成后,停止旋转活动指示器。

我目前正在使用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()方法以规避这一点,但无法在UIActivityIndi​​catorView文档中找到有关UI的足够信息更新以了解更新它的任何其他方式,但我相信这可能是问题的核心。

我需要的只是让spinner在上传过程开始之前启动(dataTaskWithRequest),一旦成功或失败就结束。我做错了什么?

1 个答案:

答案 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