Swift Progress View值传递功能

时间:2015-08-10 15:34:44

标签: ios swift core-data

我需要实现一个考虑了几个因素的进度条。

我有三个不同的类,我的ViewController,一个用于处理网络调用的Networking类和一个用于处理所有数据库操作的dataManager类。

现在我的progressView存在于我的viewcontroller中,我正在研究一种更新它的方法,因为每个不同的操作都在其他类中执行。

我正在使用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调用网络并在它完成之前执行一堆其他的东西,沿途更新进度条会很方便,但我不确定最好的方法吗?

的DataManager

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

        var jsonError: NSError?

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

//....

}

1 个答案:

答案 0 :(得分:0)

我对swift不太熟悉所以我无法给你一个代码示例,但我这样做的方法是在你的Networking类library(ggplot2) ohio_poly <- map_data('county', region='ohio') ggplot(ohio_poly, aes(x=long, y=lat, group=group)) + geom_polygon(color='black', fill=NA) + coord_map() + theme_classic() 上创建一个协议并在你的ViewController。协议方法类似于(在objective-c中)NetworkingDelegate

这假设您的ViewController调用Networking.makeGetRequest。如果它是另一个类,你将在该类中实现委托,或者你可以通过DataManager类冒充对ViewController的委托调用。