【问题标题】:TableView not reloading after executeFetchRequest执行FetchRequest后TableView没有重新加载
【发布时间】:2015-10-12 20:39:11
【问题描述】:

当应用启动时,我向执行refreshCategories 函数的ViewController 发送通知,问题是tableView 仅在我滚动或经过很长时间(20 秒或更长时间)后才会重新加载。

这是我的代码:

class PopularCategoriesTableViewController: UITableViewController {

    var categoryList:[Category]!

    override func viewDidLoad() {
        super.viewDidLoad()

        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("refreshCategories"),
            name: Constants.NotificationKeys.shouldReloadCategories, object: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - 
    func refreshCategories() {
        categoryList = DataModelUtil.sharedInstance.getRecordsFromEntity(Category.classString()) as! [Category]
        self.tableView.reloadData()

    }

    // MARK: - Table view data source
    override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 0.01
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if categoryList == nil {
            return 0
        }

        return categoryList.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let item = categoryList[indexPath.row]

        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
        cell.textLabel?.text = item.name

        return cell
    }

}

这是执行获取的方法:

func getRecordsFromEntity(entity:String) -> [NSManagedObject]! {
    let fetchRequest = NSFetchRequest(entityName: entity)
    do {
        return try appDelegate.managedObjectContext.executeFetchRequest(fetchRequest) as! [NSManagedObject]
    } catch let error as NSError {
        print("Could not execute FetchRequest \(error), \(error.userInfo)")
    }
    return nil
}

注意:我发现使用dispatch_async 时效果很好。

dispatch_async(dispatch_get_main_queue(),{ ()->() in
                self.tableView.reloadData()
            })

但我在 iOS 8 中用 Objective-c 不需要这个,而且我认为每次我想重新加载数据时都使用 dispatch 是不正确的。

【问题讨论】:

    标签: ios swift uitableview ios9 reloaddata


    【解决方案1】:

    任何 UI 操作都必须在主队列上完成。如果您不遵守此规则,您将遇到奇怪的崩溃。我还建议您使用NSFetchedResultsController,因为您使用的是tableView。 遵守 Core Data 线程规则,将您的数据保存在任何地方,您的表格将自动更新。您可以通过重置 NSFetchedResultsController 并再次初始化来手动刷新表格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 2017-11-14
      相关资源
      最近更新 更多