核心数据加载Swift后asynchronous刷新UITableView

我有一个UITableView, tViewNews

我有一个刷新function,从我的服务器下载数据,将其存储到核心数据,然后表视图从核心数据加载这些数据。

它完美的作品

 func refresh(refreshControl: UIRefreshControl) { self.newsArray = [NewsItem]() self.newslists = [[NewsItem]]() self.getNewsFromServer() self.getNewsFromCoreData() self.tViewNews.reloadData() refreshControl.endRefreshing() } 

现在,当用户第一次打开新闻viewDidLoad() ,我希望表视图首先从核心数据加载,然后从服务器asynchronous填充我的表视图数组(使用与刷新函数完全相同的方法)和然后重新加载表视图。

所以我已经在我的viewDidLoad()函数中尝试了下面的代码。

 override func viewDidLoad() { super.viewDidLoad() // Getting news from Core Data getNewsFromCoreData() // Updating core data from server and populating table view from core data dispatch_async(dispatch_get_main_queue()) { self.newsArray = [NewsItem]() self.newslists = [[NewsItem]]() self.getNewsFromServer() self.getNewsFromCoreData() self.tViewNews.reloadData() } 

正如你所看到的那样,asynchronous请求中运行的函数与refresh函数中的函数完全相同。

但是,刷新function正常工作,填充和重新加载表视图。 但asynchronous请求绝对没有。 表格视图保持空白。 但是这些函数正在运行,正如print语句所testing的那样。

任何人都知道为什么这样?

编辑 – 增加额外的fucntions

获取核心数据

 func getNewsFromCoreData() { let temp = StaffCoreData() temp.getAllNews() newsDates = Dictionary<Int, [NewsItem]>() for newsobj in temp.newsArray{ if var curdate = newsDates[toNewsItem(newsobj).age]{ curdate.append(toNewsItem(newsobj)) newsDates[toNewsItem(newsobj).age] = curdate }else{ newsDates[toNewsItem(newsobj).age] = [toNewsItem(newsobj)] } } for var i = 0; i<50; ++i{if let curdate = newsDates[i]{newslists.append(curdate)}} 

获取服务器数据

用下面的方法运行实例:

 func NewsCallReturnsWithSuccess(data: NSData) { if let jsonObject : AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) { if let statusesArray = jsonObject as? NSArray{ newsArray.removeAll(keepCapacity: true) for item in statusesArray { let datacon : NSData = item.dataUsingEncoding(NSUTF8StringEncoding)! let jsonObject : NSDictionary! = NSJSONSerialization.JSONObjectWithData(datacon, options: NSJSONReadingOptions.MutableContainers, error: nil) as! NSDictionary let title : NSString = jsonObject.objectForKey("title") as! NSString let content : NSString = jsonObject.objectForKey("content") as! NSString let publishedby : NSString = jsonObject.objectForKey("publishedby") as! NSString let modified : NSString = jsonObject.objectForKey("modified") as! NSString let imageurl : NSString = jsonObject.objectForKey("imageurl") as! NSString let category : NSString = jsonObject.objectForKey("category") as! NSString let newsItem = NewsItem(title: title as String, content: content as String, category: category as String, imageURL: imageurl as String, publishedBy: publishedby as String, modified: modified as String) newsArray.append(newsItem) } //add complete array to CoreData let temp = StaffCoreData() temp.addArrayOfNew(newsArray) } } } 

当你使用一个不同的线程来加载你的数据时,你必须在完成加载后返回到主线程来更新UI。

喜欢:

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { // load data dispatch_async(dispatch_get_main_queue()) { // update ui } } 

UPDATE

请向我们展示您的getNewsFromCoreData()getNewsFromServer()方法,也许您的cellForRowAtIndexPath

 override func viewDidLoad() { super.viewDidLoad() dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { // load data self.newsArray = [NewsItem]() self.newslists = [[NewsItem]]() self.getNewsFromServer() self.getNewsFromCoreData() dispatch_async(dispatch_get_main_queue()) { // update ui self.tViewNews.reloadData() } } }