如何让我的 Activity 指标在正确的时间启动?

How do I get my Activity Indicator to start at the right time?

根据我读到的所有内容,您可以使用按钮激活它,所以我将它放在启动 http POST 和上传的按钮操作之后,但现在它在功能完成后立即开始旋转,上传完成后,与我期望的相反。
我是 Swift 的新手,所以请像对待 nubie 一样解释你的答案。非常感谢。

@IBAction func upload(sender: AnyObject) {

    myActivityIndicator.startAnimating()

    var imageData = UIImagePNGRepresentation(myImageView.image)

    if imageData != nil{
        var request = NSMutableURLRequest(URL: NSURL(string:"http://www.example.com/upload.php")!)

        var session = NSURLSession.sharedSession()

        request.HTTPMethod = "POST"

        var boundary = NSString(format: "---------------------------14737809831466499882746641449")
        var contentType = NSString(format: "multipart/form-data; boundary=%@",boundary)
        //  println("Content Type \(contentType)")
        request.addValue(contentType, forHTTPHeaderField: "Content-Type")

        var body = NSMutableData.alloc()

        // Title
        body.appendData(NSString(format: "\r\n--%@\r\n",boundary).dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(NSString(format:"Content-Disposition: form-data; name=\"title\"\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData("Hello World".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)!)

        // Image
        body.appendData(NSString(format: "\r\n--%@\r\n", boundary).dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(NSString(format:"Content-Disposition: form-data; name=\"profile_img\"; filename=\"img.jpg\"\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
        //           println("body=\(body)")
        body.appendData(NSString(format: "Content-Type: application/octet-stream\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding)!)
        body.appendData(imageData)
        body.appendData(NSString(format: "\r\n--%@\r\n", boundary).dataUsingEncoding(NSUTF8StringEncoding)!)



        request.HTTPBody = body


        var returnData = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil)

        var returnString = NSString(data: returnData!, encoding: NSUTF8StringEncoding)

        println("returnString \(returnString)")

        //self.myActivityIndicator.stopAnimating()
        //self.myImageView.image = nil

    }


}

试试这个

myActivityIndicator.startAnimating()        
          dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)) {
            //Do your post code here or call the post func
            dispatch_async(dispatch_get_main_queue()) {
                myActivityIndicator.stopAnimating()
            }
    }

http://ijoshsmith.com/2014/07/29/a-swift-app-that-calls-json-web-services/ http://www.raywenderlich.com/79149/grand-central-dispatch-tutorial-swift-part-1

发生这种情况是因为此调用阻塞了主线程(负责更新 UI:

var returnData = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil)

因此,在这行代码之后,您在 UI 上所做的一切都不会显示,直到此同步调用完成。

这里的解决方案是在后台线程上进行此调用,然后在完成后更新主线程上的 UI。

实现此目的的最佳方法之一是使用 GCD(Grand Central Dispatch)。 GCD 是一个线程 API,这使得在后台线程上工作变得容易。

上面的回答中已经提到:

    dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), {

        var returnData = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil)

        dispatch_async(dispatch_get_main_queue()) {
            myActivityIndicator.stopAnimating()
        }

    })

iOS 开发的关键原则之一是不阻塞主线程。

这会导致糟糕的用户体验。

此外,始终在主线程上更新 UI 非常重要。

只是想让你知道还有其他方法可以在没有 GCD(线程 API)的情况下处理这种情况,例如 NSOperation

此外,您可以改为发送 异步 请求。