簡體   English   中英

如何讓我的活動指標在合適的時間開始?

[英]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-c​​alls-json-web-services/ http://www.raywenderlich.com/79149/grand-central-dispatch-tutorial-迅速部分-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

此外,您可以發送異步請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM