【问题标题】:Data not fully loaded from Core Data when being called by UICollectionView to display cell被 UICollectionView 调用以显示单元格时,数据未从 Core Data 完全加载
【发布时间】:2015-11-13 08:24:25
【问题描述】:

我想在 UICollectionView 中显示从 viewDidLoad 中的 Core Data 读取的一些数据。但是,当 UICollectionView 呈现其单元格时,数据尚未完全加载。因此,UICollectionView 是空的。

我想问的是如何在 UICollectionView 开始加载其单元格之前确保数据准备就绪。以下是我正在处理的代码的一部分。

class MenuViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {

    @IBOutlet weak var categoryCollectionView: UICollectionView!

    var allDishes = [AnyObject]()
    var categoryList = [String]()

    let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        let request = NSFetchRequest(entityName: self.dishItemEntityName)
        var allDishes = self.context?.executeFetchRequest(request, error: nil)

        if let allDishes = allDishes {
            for dish in self.allDishes {
                let dish = dish as! DishItem
                if contains(self.categoryList, dish.category) {
                    continue
                } else {
                    self.categoryList.append(dish.category)
                }
            }
        }
    }


    // MARK: Delegate Methods

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return self.categoryList.count
    }
}

【问题讨论】:

    标签: ios swift cocoa-touch core-data uicollectionview


    【解决方案1】:

    在 viewDidLoad 结束时调用 reloadData

    override func viewDidLoad() {
        ...
        categoryCollectionView.reloadData()
    }
    

    【讨论】:

    • 对不起,它不起作用。不过还是谢谢大家! :)
    【解决方案2】:

    viewDidLoadviewWillAppear 之前被调用。您可以在viewWillAppear 的集合视图上调用reloadData

    更好:使用NSFetchedResultsController,这将为内存管理、性能和自动更新带来许多其他好处。

    【讨论】:

    • 非常感谢!完美运行!我可以再问一个问题吗?为什么NSFetchedResultsController 线程安全?与NSFetchRequest 相比,它的工作方式有何不同?
    • 填充表格视图时,获取的结果控制器将始终在主线程上运行。后台核心数据线程应该使用主上下文的子上下文 - 当您保存这样的子上下文时,主上下文会更新,FRC 将在自己的线程上自动更新表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多