【发布时间】:2016-02-27 21:35:17
【问题描述】:
我想按照 iOS Messages 的工作方式设置 NSFetchedResultsController,这意味着,我想先获取最新的项目以填满屏幕,然后在用户在 tableview 中回滚历史时获取。
我认为我对仅使用 FetchedResultsController 有一点偏见,它是“正常”的代表,我不太确定如何去做。
我也不确定这是否是我想要获得的正确工具:)
我只想获取最近的记录,将它们显示在表格视图中,当用户向上滚动时,继续获取项目并将它们插入现有行的上方。
这只是我目前的常规设置:
import UIKit
import CoreData
class ViewController: UIViewController {
var coreDataStack: CoreDataStack!
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var addButton: UIBarButtonItem!
var fetchedResultsController: NSFetchedResultsController!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let fetchRequest = NSFetchRequest(entityName: "Item")
let timestampSort = NSSortDescriptor(key: "timestamp", ascending: true)
fetchRequest.sortDescriptors = [timestampSort]
fetchedResultsController =
NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: coreDataStack.context, sectionNameKeyPath: nil, cacheName: nil)
self.fetchedResultsController.delegate = self
do {
try self.fetchedResultsController.performFetch()
} catch let error as NSError {
print("initial fetch error is: \(error.localizedDescription)")
}
}
}
extension ViewController: UITableViewDataSource {
func numberOfSectionsInTableView
(tableView: UITableView) -> Int {
return self.fetchedResultsController.sections!.count
}
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
let sectionInfo = fetchedResultsController.sections![section]
return sectionInfo.name
}
func tableView(tableView: UITableView,
numberOfRowsInSection section: Int) -> Int {
let sectionInfo = self.fetchedResultsController.sections![section]
return sectionInfo.numberOfObjects
}
func tableView(tableView: UITableView,
cellForRowAtIndexPath indexPath: NSIndexPath)
-> UITableViewCell {
let cell =
tableView.dequeueReusableCellWithIdentifier(
"ItemCell", forIndexPath: indexPath)
as! ItemCell
let item = self.fetchedResultsController.objectAtIndexPath(indexPath) as! Item
cell.textLabel.text = item.name
return cell
}
}
extension ViewController: NSFetchedResultsControllerDelegate {
func controllerWillChangeContent(controller: NSFetchedResultsController) {
self.tableView.beginUpdates()
}
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch type {
case .Insert:
self.tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Automatic)
case .Delete:
self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Automatic)
case .Update:
return
case .Move:
self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Automatic)
self.tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Automatic)
}
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
self.tableView.endUpdates()
}
}
【问题讨论】:
-
我希望它按升序排序,但我只想获取最后 x 条记录,然后在用户向上滚动时获取较早的记录。如果有 100 条记录,我想要最后 20 条,按升序排序,然后用户可以向上滚动,它将获取前 80 条
标签: ios swift core-data nsfetchedresultscontroller