- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
抱歉核心数据新手...
我在 UITableViewController
上使用 NSFetchedResultsController
。实体中的数据包含时间戳
。作为 sectionID
我想在节标题中使用日期。但是,当我使用 sectionNameKeyPath
时,Core Data 会加载所有数据,而不是考虑 fetchBatchSize
。
我想要的是可能的吗?如果是的话,我做错了什么。如果使用 fetchedResultsController
无法做到这一点,还有哪些替代方案?
fetchedResultController:
class func transactionsResultController(wallet: Wallet, batchSize: Int? = nil) -> NSFetchedResultsController<Transaction> {
let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
let context: NSManagedObjectContext = appDelegate.managedObjectContext
let fetchedResultsController: NSFetchedResultsController = { () -> NSFetchedResultsController<Transaction> in
let fetchRequest: NSFetchRequest<Transaction> = Transaction.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "ANY wallet == %@", wallet)
fetchRequest.fetchBatchSize = batchSize ?? 20
let sortDescriptor = NSSortDescriptor(key: #keyPath(Transaction.timestamp), ascending: false)
fetchRequest.sortDescriptors = [sortDescriptor]
let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: "sectionIdentifier", cacheName: nil)
do {
try aFetchedResultsController.performFetch()
} catch let error {
debug(error)
}
return aFetchedResultsController
}()
return fetchedResultsController }
部分标识符:
extension Transaction{
var sectionIdentifier: String {
let date = self.timestamp!.timestampToUTCDate(currency: (self.senderId?.currency!)!)
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone(abbreviation: "en_US_POSIX")
var components = DateComponents()
let comps = Calendar.current.dateComponents([.year, .month, .day], from: date)
components.day = comps.day
components.month = comps.month
components.year = comps.year
let calendar = Calendar.current
let reconstructedDate = calendar.date(from: components)!
dateFormatter.dateFormat = "dd"
let prettyDay = dateFormatter.string(from: reconstructedDate)
dateFormatter.dateFormat = "MMMM"
let prettyMonth = dateFormatter.string(from: reconstructedDate)
dateFormatter.dateFormat = "YYYY"
let prettyYear = dateFormatter.string(from: reconstructedDate)
if (calendar.isDateInToday(reconstructedDate)){
return "Today"
}
else if (calendar.isDateInYesterday(reconstructedDate)){
return "Yesterday"
}
return "\(prettyDay) \(prettyMonth) \(prettyYear)"
} }
感谢您花时间阅读和帮助 ;)
最佳答案
fetchedResultsController
不考虑 batchSize。 fetchedResultsController
的工作方式是使用谓词进行提取,然后监视上下文以查看项目何时添加或删除到 fetchedObjects 列表并进行相应更新。如果改变的项目通过谓词,但不在列表中,它是一个插入;如果更改的项未通过谓词,但在列表中,则为删除,否则为更新或移动。如果它遵守批量大小,那么 fetchedResultsController
就很难知道通过谓词但不在列表中的更改项是插入项还是通过 batchSize 的项。
这里有两种可能的解决方案:
让 fetchedResultsController
获取具有 batchSize 限制的所有内容。然后在您的用户界面中限制您显示的数量。不要通过在 tableView 中减少行来限制它 (NUMBER_OF_ROWS -= min(REAL_NUMBER, SIZE_LIMIT)。有太多烦人的边缘情况你必须跟踪 - 比如移动和插入,推送会将项目推出在底部列出,并为未显示的项目委托(delegate)事件。它们不是很难处理,但它们可以加起来,如果你搞砸了,tableView 将停止工作。声明要容易得多indexPath 在特定索引上方的行高为 0。这样您仍然可以像往常一样响应委托(delegate)的 fetchedResultsController 事件,但 UI 不会显示单元格。
添加另一个谓词,将您的结果限制为所需的数量。例如,如果您的项目是按日期排序的,并且您只想要最近的添加谓词“date > CUT_OFF_DATE”。要确定要使用的正确日期削减,您可以执行一次提取,其中 batchSize=1 并且 batchOffset 等于您要显示的最大数量。然后在谓词中使用该对象的日期来创建 fetchedResultsController。虽然在加载 Controller 时会遵守限制,但随着插入的项目越来越多,显示的数量会增加,超过初始显示限制。
如果你有很多项目并且想限制进入内存的数量,第二个选项更好。
如果你想限制每个部分显示的数量(不仅仅是整个表格的全局限制)那么第一个选项可以支持,但第二个选项不能。
关于swift - NSFetchedResultsController sectionNameKeyPath 不遵守 fetchBatchSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47894389/
我想显示项目,以便它显示基于 sharedToUsers 的所有项目。表示带有 User.user_id 的部分名称,它应该显示与该用户的所有共享项目。但我无法正确设置 NSFetchedResult
我正在开发一个使用 Core Data 和 NSFetchedResultsController 的应用程序。模型设置是这样的: /-----------\ /-----------
我是核心数据方面的新手,正在尝试弄清楚如何在我的 NSFetchedResultsController 中创建自定义 sectionNameKeyPath。我有一个托管对象,其属性名为 acctPer
我在使用关系创建 tableView 部分时遇到困难。 我有两个具有关系的实体 List > Item。 我希望 List 成为部分,Item 成为行。我用键路径 @"itemList" 设置了 se
我有一个在 iOS 上使用 Core Data 数据源的 UITableViewController。这些项目是按日期排序的事件。我已经在使用 sectionNameKeyPath 按日期将事件分成几
我正在执行此 SO 帖子 Custom Core Data SectionNameKeyPath : 特别是 Martin R 的第一个建议是添加一个类别方法来喂我的 sectionNameKeyPa
我遵循了这个建议: Format sectionNameKeyPath NSFetchedResultsController - Swift 我在执行此操作时遇到了一些问题。使用 Xcode 8 和
抱歉核心数据新手... 我在 UITableViewController 上使用 NSFetchedResultsController。实体中的数据包含时间戳。作为 sectionID 我想在节标题中
我正在尝试使用存储的 NSDate 属性为我的核心数据提取格式化我的 sectionNameKeyPath。它完全正常工作,并根据 NSDate 将记录拉/分类到多个部分,但我不确定如何格式化它以按
我有一个实体 Order,其属性为 paid,这是一个 bool 值。 我想在 UITableView 中显示所有订单,但我想将它们分为两个部分:“未支付”和“已支付”。所以我想我应该将“付费”作为
我在 Core Data 中有一个任务列表。我使用 NSFetchedResultsController 将它们提取到 UITableView 中。 我需要自定义顺序的自定义部分: 逾期 活跃 进行中
假设有一个名为 testTable 的表: (NSNumber*) numValue (NSString*) stringValue 那么假设里面大概有50条记录。 numValue 每条记录都不一样
我有一个包含三个实体的核心数据模型:Notification、Group 和 Customer。它们之间的关系如下: 一个客户属于多个组,一个组可以有多个客户。 一个通知被发送(属于)一个组,一个组可
我有一个由 NSFetchedResultsController 支持的 UITableView。 表格 View 显示聊天对话。 我有几个聊天对话类型 (NSNumber),表格 View 根据您的
我有一种情况,我正在使用 NFC 获取消息列表。每条消息都有一个名为“未读”的属性,如果未被看到则设置为 true。我还使用了一个 sortDescriptor,它按照从最新到最旧的顺序给我消息。 我
情况是这样的。我有 2 个模型: 运动(具有属性名称和关系玩家) 播放器(具有属性名称和 relationShip sport) 在 ViewController 中,我不想在按运动排序的 UITab
我一直无法弄清楚如何在 Swift 中执行以下操作并寻找指针。 我正在从 Core Data 中提取字符串值并将它们显示在 UITableView 中……它正在工作并显示所有条目。我现在想按创建日期(
我有一个属性为“组”的实体,因为我想按“组”(0 或 1)将我的实体列表分成两部分 @property (nonatomic, retain) NSNumber * group; 在我的 fetche
使用 Xcode8.3 在 Swift 3 中工作良好 我正在进行一个项目,其中包含用于保存消息的核心数据。 它根据时间对消息进行排序,并根据日期对消息进行分段。 方法如下: let request
我正在使用 NSFetchedResultsController 按部分分组,其中 sectionNameKeyPath 根据类别。 我的类别是:成人、 child 、视觉、无。 升序排序:成人、 c
我是一名优秀的程序员,十分优秀!