Ios 核心数据:后台抓取

Ios 核心数据:后台抓取,ios,multithreading,core-data,Ios,Multithreading,Core Data,我读过很多类似的问题,但似乎没有答案 我有一个后台线程,用于获取数据 // bg queue let context = // private context with NSPrivateQueueConcurrencyType users = Model.MR_findAllSortedBy("username", ascending: true, inContext: context) as! [Model] 我想用[Model]数组在主线程中重新加载tableView。 如果我将用户直接

我读过很多类似的问题,但似乎没有答案

我有一个后台线程,用于获取数据

// bg queue
let context = // private context with NSPrivateQueueConcurrencyType
users = Model.MR_findAllSortedBy("username", ascending: true, inContext: context) as! [Model]
我想用[Model]数组在主线程中重新加载tableView。 如果我将
用户
直接传递到主线程,将导致未定义的行为(根据CD文档)

另一方面,我有两个选择:

  • 获取主上下文上的对象(这将导致UI块)
  • 传递objectId,这将导致对象取消使用(这将导致UI块)

  • 正确的处理方法是什么?

    最好的设置是使用带有
    NSFetchedResultsController的表视图(使用神奇记录也非常方便),并实现将自动更新表的
    NSFetchedResultsController委托

    只需在主线程上轻松地获取所有内容和排序(FRC将优化并仅获取表视图需要显示的内容)。这意味着您对选项1的假设。这是不对的

    do { fetchedResultsController.performFetch() } catch {}
    tableView.reloadData()
    

    是您所需要的一切。

    最好的设置是使用带有
    NSFetchedResultsController的表视图(使用Magic Record也非常方便),并实现将自动更新表的
    NSFetchedResultsController委托

    只需在主线程上轻松地获取所有内容和排序(FRC将优化并仅获取表视图需要显示的内容)。这意味着您对选项1的假设。这是不对的

    do { fetchedResultsController.performFetch() } catch {}
    tableView.reloadData()
    

    是您所需要的全部。

    除了NSfetchedResultController之外,还有其他方法吗?您不需要其他设置。FRC帮助您获取尽可能少的数据,从而避免了大量的数据库搜索,而这正是使背景获取成为必要的首要因素。手工进行优化是非常困难的,也就是说,你可以做,但不应该做,除非你有充分的理由需要它。我看不到任何内容。假设我需要进行分页,首先从服务器获取数据,然后将其传递给FRC,就像您在后台所做的那样,但不将对象传递给某个主线程数组。只需
    save()
    ,将更改推送到主线程上的父上下文,FRC就会处理其余的内容。除了NSfetchedResultController之外,还有其他方法吗?您不需要其他设置。FRC帮助您获取尽可能少的数据,从而避免了大量的数据库搜索,而这正是使背景获取成为必要的首要因素。手工进行优化是非常困难的,也就是说,你可以做,但不应该做,除非你有充分的理由需要它。我看不到任何内容。假设我需要进行分页,首先从服务器获取数据,然后将其传递给FRC,就像您在后台所做的那样,但不将对象传递给某个主线程数组。只需
    save()
    ,将更改推送到主线程上的父上下文,FRC将处理其余的更改。