- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当用户运行应用程序时,他首先必须登录。如果登录成功,会触发一个名为setUpSaving的函数。在 setUpSaving 中,正如我在代码的注释部分中所写的那样,(“发生了一些 firebase 事情,抓取所有消息,对于每条消息,一条一条地通过 createMessageWithText 并将消息插入到核心数据中,最终保存它.”
所以,我的问题就在这里。假设用户有 20,000 条与他正在发消息的某人关联的消息。当他转到 ChatLogController 时,所有消息都必须呈现给用户。我这样做的方法是使用 NSFetchedResultsController 执行 fetch 来加载登录 Controller 中保存的所有消息。我的问题是,所有这些都在主队列上,有时,这会卡住 UI 相当长一段时间。我的 chatLogController 代码如下(不是全部,只是 fetchedResultsController 部分和 collectionView),我想知道如何在后台队列上执行 fetch,但仍然更新主队列上的 collectionView。
func setUpSaving() {
///////some firebase stuff happens, grabs all the messages, and for each message, one by one, it goes through createMessageWithText and inserts the message into core data,
somewhere along the line context.save() gets triggered saving the message.
}
private func createMessageWithText(text: String, friend: Friend, context: NSManagedObjectContext, date: NSDate, isSender: Bool = false, sentStatus: String, fromID: String) -> Mesages {
let message = NSEntityDescription.insertNewObjectForEntityForName("Mesages", inManagedObjectContext: context) as! Mesages
message.user = friend
message.text = text
message.timestamp = date
message.isSender = isSender
message.fromID = fromID
message.status = sentStatus
return message
}
}
lazy var fetchedResultsControler: NSFetchedResultsController = {
let fetchRequest = NSFetchRequest(entityName: "Mesages")
fetchRequest.fetchBatchSize = 20
fetchRequest.includesPendingChanges = false
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "timestamp", ascending: true)]
fetchRequest.predicate = NSPredicate(format: "user.id = %@", self.friend!.id!)
let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
let frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)
frc.delegate = self
return frc
}()
override func viewDidLoad() {
super.viewDidLoad()
NavigationItems()
revealStatus()
do {
try fetchedResultsControler.performFetch()
} catch let err {
print(err)
}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) ->
Int {
if let count = fetchedResultsControler.sections?[0].numberOfObjects {
return count
}
return 0
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = super.collectionView(collectionView, cellForItemAtIndexPath: indexPath) as! JSQMessagesCollectionViewCell
return cell
}
最佳答案
不,您不应该获取将在后台线程上驱动 UI 的 FRC。
您的问题是登录后加载 20,000 个项目背后的想法。没有人可以或不会在移动设备上查看这么多的消息。您可能希望在登录后获得 20 以及总数,但仅此而已。
当用户查看消息时,您应该按需加载页面,可能包含 20 到 100 条消息。这样,您就不会使用用户未要求您使用的资源,也不会花费任何处理时间来执行此操作。
搜索也应该由服务器完成。
关于ios - 在后台线程上执行 NSFetchedResultsController 的获取是一个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39215766/
我是一名优秀的程序员,十分优秀!