Ho un UITableView, tViewNews
rinfrescante UITableView in modo asincrono dopo Core Data Loaded Swift
Ho una funzione di aggiornamento, che scarica i dati dal mio server, memorizza in dati di base, e poi i carichi vista tabella questi dati da dati di base .
funziona perfettamente
func refresh(refreshControl: UIRefreshControl) {
self.newsArray = [NewsItem]()
self.newslists = [[NewsItem]]()
self.getNewsFromServer()
self.getNewsFromCoreData()
self.tViewNews.reloadData()
refreshControl.endRefreshing()
}
Ora, quando l'utente apre prima la notizia viewDidLoad()
, vorrei per la vista tabella per primo carico a partire dai dati di base, quindi in modo asincrono popolare mio tavolo vista serie dal server (utilizzando esattamente lo stesso metodo della funzione di aggiornamento) e quindi ricaricare la vista tabella.
Quindi ho provato il seguente codice nella mia funzione 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()
}
Come si può vedere le funzioni eseguite all'interno della richiesta asincrona sono identiche a quelle all'interno della funzione di aggiornamento.
Ma!, La funzione di aggiornamento funziona correttamente, popolando e ricaricando la vista tabella. Ma la richiesta asincrona non fa assolutamente nulla. La vista tabella rimane vuota. Ma le funzioni sono in esecuzione, come testato con le dichiarazioni di stampa.
Qualcuno sa perché questo è il caso?
EDIT - Aggiunto fucntions aggiuntivi
Get Core Data
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)}}
Get Server Data
corre esempio con le seguenti modalità:
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)
}
}
}
Come funzionano i tuoi getNewsFromServer e getNewsFromCoreData. Recuperano il contenuto nel thread in background? – Sandeep