Обновление UITableView асинхронно после загрузки основных данных Swift

У меня есть UITableView, tViewNews

У меня есть функция обновления, которая загружает данные с моего сервера, сохраняет их в основные данные, а затем представление таблицы загружает эти данные из основных данных.

Он отлично работает

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

Теперь, когда пользователь сначала открывает news 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() } 

Как вы можете видеть, функции, выполняемые внутри асинхронного запроса, идентичны функциям внутри функции обновления.

Но !, функция обновления функционирует правильно, заполняя и перезагружая представление таблицы. Но асинхронный запрос абсолютно ничего не делает. Вид таблицы остается пустым. Но функции работают, как проверено с помощью операторов печати.

Кто-нибудь знает, почему это так?

EDIT – добавлены дополнительные функции

Получить основные данные

 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) } } } 

One Solution collect form web for “Обновление UITableView асинхронно после загрузки основных данных Swift”

Когда вы используете другой поток для загрузки ваших данных, вы должны вернуться в основной поток, когда закончите загрузку, чтобы обновить интерфейс.

Подобно:

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

ОБНОВИТЬ

Pls покажет нам ваши 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() } } } 
  • iOS * Производительность ячеек: Autolayout vs Frame?
  • как установить размер / позицию пользовательского UIView для его размещения в пользовательском UITableViewCell?
  • Зачем нужно переопределять layoutSubviews
  • Карта Аннотации к ячейке UITableViewController
  • Изменение цвета ячейки UITableView в прокручиваемом запросе
  • Как определить, когда заголовок UITableView прокручивается из видимой области?
  • Динамический размер iOS 7 для UILabel
  • Автоматизация IOS UITableview с помощью appium
  • Изображения, загруженные из URL-адреса, изменяются в прокрутке в UITableView
  • Настройка действия для пользовательской кнопки раскрытия информации UITableView
  • Отображение данных в таблицеView: вызов контактов из сборщика в таблицуView 29 и подсчет
  • Почему insertRowsAtIndexPaths всегда заставляет TableView прокручивать вверх?
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.