从异步任务加载UITableViewController中的值

时间:2015-03-18 13:58:05

标签: ios uitableview swift

我在尝试加载UITableViewController时遇到问题。

我有一个在 loadView 方法中调用的异步任务。这个异步任务运行良好,结果按照我的预期返回。

问题是,尝试填充TableView时应用程序失败。

我怀疑这是因为在调用方法时我的数据没有完全加载。

是否有强制TableView等待我的异步任务完成?

加载我的数据的函数:

func loadNetInformations(){
    var postString: NSString = "info=all"

    HTTPGet("myurl", "POST", postString){
        (data: NSArray, error:String?)-> Void in
        if error != nil{
            println(error)
        }
        else{
            for value in data{
                var sService: NSString = "some value"

                var aContent: NSArray = value["Content"] as NSArray

                var sNumberCount: NSNumber = aContent.count

                self.aListeService.addObject(sService)
                self.aSizeOfDpt.addObject(sNumberCount)
                self.aContenuListes.addObject(aContent)

                self.bFinishLoading = true

            } // End for in HTTPGet
        } // End else in HTTPGet
    } // End HTTPGet

} // End LoadNet Information

我的HTTPGet方法如下:

func HTTPSendRequest(request: NSMutableURLRequest,
callback: (NSArray, String?) -> Void){
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
        data, response, error in

        if error != nil {

            callback (NSArray(), error.localizedDescription)
            println("error=\(error)")
            return
        }
        else{
            callback(NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil)! as NSArray, nil)

        }


    }
    task.resume()
}


func HTTPGet(url: String, requestMethod: String, postString: String, callback: (NSArray, String?) -> Void){
     var request = NSMutableURLRequest(URL: NSURL(string: url)!)
    request.HTTPMethod = requestMethod
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    HTTPSendRequest(request, callback)
}

编辑:好了,我现在没有错误了(我使用了NSString作为NSInteger ......)但它没有显示任何内容

EDIT2: 这是我的JSON格式,以防它可以提供帮助:

[
  {
    "CodeAbsence" : "6000", 
    "Content" : 
                [
                  {
                    "Init":"DAS",
                    "Nom":"Name",
                    "Prenom":"Firstname",
                    "IdAbsence":"619",
                    "TimbreusePresent":"O",
                    "TimbreuseHeure":"14:44",
                    "TimbreuseRaison":"0",
                    "TimbreuseDate":"",
                    "CodeAbsence":"6000",
                    "Telephone":"248"
                   },
                    ....
               ]
  },
   .......
 ] 

2 个答案:

答案 0 :(得分:1)

您需要重新加载tableView以触发表更新,并且需要在主UI线程上触发它。

        for value in data{
            var sService: NSString = "some value"

            var aContent: NSArray = value["Content"] as NSArray

            var sNumberCount: NSNumber = aContent.count

            self.aListeService.addObject(sService)
            self.aSizeOfDpt.addObject(sNumberCount)
            self.aContenuListes.addObject(aContent)

            self.bFinishLoading = true
            dispatch_async(dispatch_get_main_queue()) {
                 self.tableView.reloadData()
            } 
        }

当您在后台线程上执行异步操作时,您的回调仍将在后台线程上运行,因此在执行任何UI任务之前,请务必切换回主线程。

答案 1 :(得分:0)

我终于找到了问题所在。它来自使用viewDidLoad()而不是viewDidAppear()