簡體   English   中英

快速進度視圖值傳遞給函數

[英]Swift Progress View Value Passed Around Functions

我需要實現一個考慮了兩個因素的進度條。

我有三個不同的類,即ViewController,用於處理網絡調用的Networking類和用於處理所有數據庫操作的dataManager類。

現在,我的progressView駐留在我的視圖控制器中,並且我正在尋找一種更新它的方法,因為在其他類中執行了每個不同的操作。

我正在使用Alamofire,所以我知道可以使用.progress {}來捕獲JSON進度的值,但這也意味着將ViewController暴露給Networking類,我認為這是不好的做法?

我認為這應該使用完成處理程序來實現,但是由於我已經設置了另一個線程來處理JSON / DB操作,所以我不想讓它變得過於復雜

聯網

 func makeGetRequest(url : String, params : [String : String]?, completionHandler: (responseObject: JSON?, error: NSError?) -> ())  -> Request? {

        return Alamofire.request(.GET, url, parameters: params, encoding: .URL)
            .progress { _, _, _ in
                           //bad practice?
                progressView.setProgress(request.progress.fractionCompleted, animated: true)
            }
            .responseJSON { request, response, data, error in completionHandler(
                responseObject:
                {


                  let json = JSON(data!)

                    if let anError = error
                    {

                        println(error)
                    }
                    else if let data: AnyObject = data
                    {

                        let json = JSON(data)
                                          }


                    return json

                    }(),
                error: error

                )
        }
    }

ViewController

 dataManager.loadData({(finished: Bool, error:NSError?) -> Void in


            if let errorMessage = error{
                 self.syncProgress.setProgress(0, animated: true)

                let alertController = UIAlertController(title: "Network Error", message:
                    errorMessage.localizedDescription, preferredStyle: UIAlertControllerStyle.Alert)
                alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default,handler: nil))
                 self.presentViewController(alertController, animated: true, completion: nil)

            }
            if finished{
                for i in 0..<100 {
                    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
                        sleep(1)
                        dispatch_async(dispatch_get_main_queue(), {
                            self.counter++
                            return
                        })
                    })
                }

            }






        })

如您所見,在更新進度條之前,我正在等待datamanger類中已完成的布爾值設置。 關鍵是,dataManager會調用網絡並在完成之前執行很多其他工作,一路更新進度條會很方便,但我不確定最佳方法是什么?

數據管理器

 func loadData(completion: (finished: Bool, error: NSError?) -> Void) {

        var jsonError: NSError?

        networking.makeGetRequest(jobsUrl, params: nil) { json, networkError  in

//....

}

我不太熟悉swift,因此無法給您提供代碼示例,但我要這樣做的方法是在Networking類NetworkingDelegate上創建一個協議,然后在ViewController中實現該協議。 協議方法類似於(在Objective-c中) NetworkingRequestDidUpdatProgress:(float progress)

這是假設您的ViewController調用Networking.makeGetRequest。 如果是另一個類,則可以在該類中實現委托,也可以通過DataManager類使對ViewController的委托調用冒泡。

暫無
暫無

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

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