[英]Refreshing UITableView Asynchronously after Core Data Loaded Swift
我有一個UITableView, tViewNews
我有一個刷新功能,從我的服務器下載數據,將其存儲到核心數據,然后表視圖從核心數據加載這些數據。
它完美地運作
func refresh(refreshControl: UIRefreshControl) {
self.newsArray = [NewsItem]()
self.newslists = [[NewsItem]]()
self.getNewsFromServer()
self.getNewsFromCoreData()
self.tViewNews.reloadData()
refreshControl.endRefreshing()
}
現在,當用戶首次打開新聞viewDidLoad()
,我希望表視圖首先從核心數據加載,然后從服務器異步填充我的表視圖數組(使用與刷新函數完全相同的方法)和然后重新加載表視圖。
所以我在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()
}
如您所見,在異步請求中運行的函數與刷新函數內的函數相同。
但是!,刷新功能正常運行,填充並重新加載表視圖。 但異步請求絕對沒有任何作用。 表格視圖仍為空。 但正如使用print語句測試的那樣,函數正在運行。
任何人都知道為什么會這樣嗎?
編輯 - 增加了額外的功能
獲取核心數據
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()
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.