2015-07-06 2 views
5

Ho un UITableView, tViewNewsrinfrescante 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) 

     } 

    } 

} 
+0

Come funzionano i tuoi getNewsFromServer e getNewsFromCoreData. Recuperano il contenuto nel thread in background? – Sandeep

risposta

2

Quando si utilizza un thread diverso per caricare i dati, è necessario tornare al thread principale al termine del caricamento per aggiornare l'interfaccia utente.

come:

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

UPDATE

Pls ci mostrano i vostri getNewsFromCoreData() e getNewsFromServer() metodi e forse il vostro cellForRowAtIndexPath, anche.

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() 
     } 
    } 
} 
+0

Grazie per la risposta. Ho ancora lo stesso errore. È possibile che io faccia questo: Su 'viewDidLoad()' popolo la vista tabella da dati di base. Quindi eseguo subito la funzione di aggiornamento, automaticamente e in modo asincrono senza chiamare effettivamente la funzione di aggiornamento. O equivalente? –

+0

Per vedere la mia risposta aggiornata. – matthias

+0

Grazie! Ho aggiunto un po 'di più alla domanda. Tuttavia, c'è troppo codice da esaminare se dovessi pubblicare tutto il mio 'cellForRowAtIndexPath' e altre funzioni. Spero che quello che ho postato sopra ti dia l'essenza.La cosa importante da notare è che la funzione di aggiornamento funziona perfettamente e mi piacerebbe averla eseguita automaticamente e in modo asincrono all'avvio. –