核心数据加载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() } } }