ios - 核心数据加载 Swift 后异步刷新 UITableView

标签 ios iphone swift uitableview asynchronous

我有一个 UITableView,tViewNews

我有一个刷新功能,它从我的服务器下载数据,将其存储到核心数据中,然后 TableView 从核心数据中加载这些数据。

完美运行

func refresh(refreshControl: UIRefreshControl) {

    self.newsArray = [NewsItem]()
    self.newslists = [[NewsItem]]()
    self.getNewsFromServer()
    self.getNewsFromCoreData()
    self.tViewNews.reloadData()

    refreshControl.endRefreshing()
}

现在,当用户第一次打开新闻 viewDidLoad() 时,我希望 TableView 首先从核心数据加载,然后从服务器异步填充我的 TableView 数组(使用与刷新功能完全相同的方法),然后重新加载 TableView 。

所以我在我的 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()

    }

如您所见,异步请求中运行的函数与刷新函数中运行的函数相同。

但是!,刷新功能正常运行,填充并重新加载 TableView 。但是异步请求绝对没有任何作用。 TableView 保持为空。但是函数正在运行,正如打印语句所测试的那样。

有人知道为什么会这样吗?

编辑 - 添加了额外的功能

获取核心数据

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

更新

请向我们展示您的 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 - 核心数据加载 Swift 后异步刷新 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31244019/

相关文章:

ios - swift:集合中的图像

objective-c - IOS复制 "drop pin"效果

ios - 如何在 icarousel ios 中找到特定的索引?

ios - *某些* iOS 8 版本中自定义导航项的内部不一致异常

iphone - 如何在 Objective C 中复制 UIButton?

ios - Swift iOS 自动调整 UITableViewCell() 的 UILabel 高度

iphone - UIViewController 的用途

android - 什么是H264Layer配置文件和级别?

ios - Swift:暂停沿路径移动的动画?

ios - 使用 Swift iOS 在 SFSafariViewController 中配置浏览器缓存