【问题标题】:Data load very slow on View Controller in swift 2.3swift 2.3 中视图控制器上的数据加载非常慢
【发布时间】:2017-05-03 05:54:54
【问题描述】:

我在 View Controller 上显示 JSON Repsonse,但一些数据会立即使用键(开始日期)加载,但其他数据需要时间才能在 View Controller My Code 上加载:

 var record : NSMutableDictionary!

var projectID = ""



override func viewDidLoad() {
    super.viewDidLoad()

   //  Do any additional setup after loading the view.
    projectID = record["id"] as String

    print("detail \(self.record)")

     self.scrollView.contentSize = CGSizeMake(0,800)
     singlePageData()

}

func singlePageData(){

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
    var errors: NSError?

    let urlString = "http://phpyouth.com/clients/halfpricedgrannyflats/app/app_response.php?project_id=\(self.projectID)&project_page=Request"
    print("URL RESPONSE  \(urlString)")

    let request = NSURLRequest(URL: NSURL(string: urlString), cachePolicy: .ReloadIgnoringLocalCacheData, timeoutInterval: 50)

    let session = NSURLSession.sharedSession()

    let task = session.dataTaskWithRequest(request) { (data, response, error) in

        if error != nil{
            //handel error

            var alertview = UIAlertView(title: "Network Error", message: "Data not received due to network connection.Try again...", delegate: self, cancelButtonTitle: "Ok")
            alertview.show()
            return
        }
        else{

        if let responseData = data{

            var jsonDict: NSDictionary = NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableContainers, error: &errors) as NSDictionary!

            println("Json dict value  \(jsonDict)")
            self.lblprojectName.text = jsonDict["name"] as? String
            println("Project Name:  \(self.lblprojectName.text)")

            let starttime = jsonDict.objectForKey("start_time") as NSString
            var interval:NSTimeInterval! = starttime.doubleValue
            var date = NSDate(timeIntervalSince1970: interval!)
            var format = NSDateFormatter()
            format.dateFormat = "dd MMM, YYYY"
            var timenewString: NSString = format.stringFromDate(date)
            self.lblstartTime.text = timenewString
            println("Start Time :  \(self.lblstartTime.text)")

            self.lblcurrentStage.text = jsonDict["current_stage"] as? String
             println("Current Stage :  \(self.lblcurrentStage.text)")

            let completiontime = jsonDict.objectForKey("completion_time") as NSString
            var intervalTime:NSTimeInterval! = completiontime.doubleValue
            var datenew = NSDate(timeIntervalSince1970: intervalTime!)
            var formatdate = NSDateFormatter()
            formatdate.dateFormat = "dd MMM, YYYY"
            var completiontimenewString: NSString = format.stringFromDate(datenew)
            self.lblcompletionTime.text = completiontimenewString
            println("Start Time :  \(self.lblcompletionTime.text)")

            self.lblManager.text = jsonDict["manager"] as? String
            println("Manager  :  \(self.lblManager.text)")

                }
            }
        }
    task.resume()
    })
}

我需要有关如何解决此问题的帮助。提前致谢

【问题讨论】:

  • Dilip Tiwari 当您调用其余 API 时使用完成块,这对您有好处
  • 请问我该怎么做

标签: json swift swift2


【解决方案1】:

下载完成后在主线程更新UI:

dispatch_async(dispatch_get_main_queue()) {
            // Update UI
}

在这种情况下:

 func singlePageData(){

            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
                var errors: NSError?

                let urlString = "http://phpyouth.com/clients/halfpricedgrannyflats/app/app_response.php?project_id=\(self.projectID)&project_page=Request"
                print("URL RESPONSE  \(urlString)")

                let request = NSURLRequest(URL: NSURL(string: urlString), cachePolicy: .ReloadIgnoringLocalCacheData, timeoutInterval: 50)

                let session = NSURLSession.sharedSession()

                let task = session.dataTaskWithRequest(request) { (data, response, error) in
                    dispatch_async(dispatch_get_main_queue()) {
                        if error != nil{
                            //handel error

                            var alertview = UIAlertView(title: "Network Error", message: "Data not received due to network connection.Try again...", delegate: self, cancelButtonTitle: "Ok")
                            alertview.show()
                            return
                        }
                        else{

                            if let responseData = data{

                                var jsonDict: NSDictionary = NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableContainers, error: &errors) as NSDictionary!

                                println("Json dict value  \(jsonDict)")
                                self.lblprojectName.text = jsonDict["name"] as? String
                                println("Project Name:  \(self.lblprojectName.text)")

                                let starttime = jsonDict.objectForKey("start_time") as NSString
                                var interval:NSTimeInterval! = starttime.doubleValue
                                var date = NSDate(timeIntervalSince1970: interval!)
                                var format = NSDateFormatter()
                                format.dateFormat = "dd MMM, YYYY"
                                var timenewString: NSString = format.stringFromDate(date)
                                self.lblstartTime.text = timenewString
                                println("Start Time :  \(self.lblstartTime.text)")

                                self.lblcurrentStage.text = jsonDict["current_stage"] as? String
                                println("Current Stage :  \(self.lblcurrentStage.text)")

                                let completiontime = jsonDict.objectForKey("completion_time") as NSString
                                var intervalTime:NSTimeInterval! = completiontime.doubleValue
                                var datenew = NSDate(timeIntervalSince1970: intervalTime!)
                                var formatdate = NSDateFormatter()
                                formatdate.dateFormat = "dd MMM, YYYY"
                                var completiontimenewString: NSString = format.stringFromDate(datenew)
                                self.lblcompletionTime.text = completiontimenewString
                                println("Start Time :  \(self.lblcompletionTime.text)")

                                self.lblManager.text = jsonDict["manager"] as? String
                                println("Manager  :  \(self.lblManager.text)")

                            }
                        }
                    }

                }
                task.resume()
            })
        }

注意:在你的情况下 请将语法更新为您的 Swift 版本。

【讨论】:

  • 我使用的是 Swift 1.2,但如果您根据 Swift 2 更新您的答案,那就太好了
  • 嗯,我们可以讨论一下问题。
【解决方案2】:

SinglePageData() 函数中的网络操作,即 Post 和 Get 应在单独的类中,并应提供回调方法,以便在完整数据到达时通知控制器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-01
    • 2016-12-16
    • 2015-09-21
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    相关资源
    最近更新 更多