- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 NSPersistentCloudKitContainer
来同步数据。使用新的 iCloud 内容刷新 UITableView 内容的正确代码是什么?如果我关闭 UITableView 并重新打开它,新内容会立即出现。
我正在使用标准代码刷新 UITableView,但使用该代码我无法从 iCloud 获取新数据?
class listFirmenTableViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
firmenTableView.refreshControl = UIRefreshControl()
firmenTableView.refreshControl?.addTarget(self, action:
#selector(handleRefreshControl),
for: .valueChanged)
}
@objc func handleRefreshControl() {
reload(tableView: self.tableView)
// Dismiss the refresh control.
DispatchQueue.main.async {
self.firmenTableView.refreshControl?.endRefreshing()
}
}
func reload(tableView: UITableView) {
tableView.reloadData()
tableView.layoutIfNeeded()
}
最佳答案
使用 NSFetchedResultsController
将使您的表自动与 CoreData
数据库保持同步。在下面的代码中,您必须将 YourEntityName
的实例替换为您在项目中使用的真实数据库实体名称。
您可能还想适本地设置 request.sortDescriptors
。例如,如果您使用的是搜索栏,则可以在排序描述符中包含搜索栏文本,然后每次搜索栏文本更改时都必须调用方法 updateFetchedResultsController()
。
至于 UIRefreshControl
,此后甚至不需要它。
import UIKit
import CoreData
class YourTableViewController: UITableViewController, NSFetchedResultsControllerDelegate {
var container: NSPersistentContainer? = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer
var fetchedResultsController: NSFetchedResultsController<YourEntityName>? {
didSet {
fetchedResultsController?.delegate = self
}
}
override func viewDidLoad() {
super.viewDidLoad()
updateFetchedResultsController()
}
func updateFetchedResultsController() {
guard let context = container?.viewContext else {
return
}
context.performAndWait {
let request: NSFetchRequest<YourEntityName> = YourEntityName.fetchRequest()
request.sortDescriptors = nil // set sort descriptors if you want data ordered specifically
request.predicate = nil // set predicate if you only want specific data
fetchedResultsController = NSFetchedResultsController<YourEntityName>(
fetchRequest: request,
managedObjectContext: context,
sectionNameKeyPath: nil,
cacheName: nil
)
do {
try fetchedResultsController!.performFetch()
tableView.reloadData()
} catch {
// Handle the error, for example, present an alert
}
}
}
// MARK:- UITableViewDataSource
override func numberOfSections(in tableView: UITableView) -> Int {
return fetchedResultsController?.sections?.count ?? 0
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let sections = fetchedResultsController?.sections, sections.count > 0 {
return sections[section].numberOfObjects
}
return 0
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if let sections = fetchedResultsController?.sections, sections.count > 0 {
return sections[section].name
}
return nil
}
override func sectionIndexTitles(for tableView: UITableView) -> [String]? {
return fetchedResultsController?.sectionIndexTitles
}
override func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int {
return fetchedResultsController?.section(forSectionIndexTitle: title, at: index) ?? 0
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellIdentifier", for: indexPath) as! YourTableViewCell
let object = fetchedResultsController?.object(at: indexPath)
// use data in object to update your cell
return cell
}
// MARK:- NSFetchedResultsControllerDelegate
func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.beginUpdates()
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange sectionInfo: NSFetchedResultsSectionInfo, atSectionIndex sectionIndex: Int, for type: NSFetchedResultsChangeType) {
switch type {
case .insert: tableView.insertSections([sectionIndex], with: .fade)
case .delete: tableView.deleteSections([sectionIndex], with: .fade)
default: break
}
}
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
switch type {
case .insert:
tableView.insertRows(at: [newIndexPath!], with: .fade)
case .delete:
tableView.deleteRows(at: [indexPath!], with: .fade)
case .update:
tableView.reloadRows(at: [indexPath!], with: .fade)
case .move:
tableView.deleteRows(at: [indexPath!], with: .fade)
tableView.insertRows(at: [newIndexPath!], with: .fade)
default:
break
}
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.endUpdates()
}
此外,请确保在 AppDelegate
中设置 container.viewContext.automaticallyMergesChangesFromParent = true
,如下所示:
lazy var persistentContainer: NSPersistentCloudKitContainer = {
let container = NSPersistentCloudKitContainer(name: "YourEntityName")
container.loadPersistentStores { description, error in
if let error = error {
// handle the error
}
}
container.viewContext.automaticallyMergesChangesFromParent = true
return container
}()
关于IOS13+ NSPersistentCloudKitContainer UIRefreshControl 如何刷新UITableView内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59130286/
我正在构建一个使用 NSPersistentCloudKitContainer 的应用程序。该应用程序没有共享功能,其唯一的后端功能是使用 cloudkit 容器在用户设备之间同步数据。该设置相当准系
我在我的生产应用中使用了 NSPersistentCloudKitContainer,但我的一些用户告诉我,在更新到引入了 NSPersistentCloudKitContainer 的最新版本后,数
我最近发布了一个使用 NSPersistentCloudKitContainer 的应用程序.在开发中,我的数据库按预期跨设备同步,但在生产中,我的数据库根本没有同步。调试完情况后,我意识到我必须将
我已将日期触发的本地通知添加到我的应用程序中,现在我希望用户能够在其拥有该应用程序的所有设备上获得他们在一台设备上设置的通知。我将他们设置的通知保存在核心数据实体中(保存通知标识符和它应该被触发的日期
我正在努力解决以下问题。尽管进行了深入搜索,但我还没有成功。 我的开发环境是 macOS Big Sur Beta 下的 Xcode 12.0 beta(但是,问题在 Catalina 下的 Xcod
集成 NSPersistentCloudKitContainer 非常简单,当用户在实现同步后添加数据时工作正常。但是,如果用户已经在不同的设备上添加了相同的数据,并且将在更新时启用同步,则所有设备上
我正在开发一个使用 NSPersistentCloudKitContainer 的应用程序在设备之间共享数据。核心数据模型有多个实体,其中两个实体通过与其各自逆的关系连接。我遇到的问题是,当我将关系设
所以我的问题如标题中所写,如果你可以使用 NSPersistentCloudKitContainer 在不同的应用程序之间共享数据,比如如果你有一个不同的 iPad 应用程序,一个不同的 iPhone
所以我的问题如标题中所写,如果你可以使用 NSPersistentCloudKitContainer 在不同的应用程序之间共享数据,比如如果你有一个不同的 iPad 应用程序,一个不同的 iPhone
Apple 推出了 NSPersistentCloudKitContainer iOS 13 使我们能够将 CloudKit 与 Core Data 结合使用。我几乎可以立即在不同的设备上运行它,但我
我正在使用 NSPersistentCloudKitContainer 来同步数据。使用新的 iCloud 内容刷新 UITableView 内容的正确代码是什么?如果我关闭 UITableView
我正在使用 NSPersistentCloudKitContainer 通过 CloudKit 在不同设备之间同步数据。它适用于新项目,但是当我将它用于旧项目时,使用 NSPersistentCont
我遵循了与“将核心数据与 CloudKit 结合使用”中相同的步骤: 新项目 启用核心数据 + Cloud Kit 添加 iCloud/CloudKit 授权 + 后台模式/远程通知授权。 在 iPh
我正在开发一个应用程序,该应用程序使用 NSPersistentCloudKitContainer 在 iOS 15 中使用新的共享支持.我没有办法告诉 Core Data 一个对象或一组对象不再共享
我正在使用 NSPersistentCloudKitContainer 通过 CloudKit 和 CoreData 在用户之间同步和共享一些记录。从 Apple website 中根据我的需要调整示
我正在使用 NSPersistentCloudKitContainer 通过 CloudKit 和 CoreData 在用户之间同步和共享一些记录。从 Apple website 中根据我的需要调整示
我知道这是一个常见问题,也许之前已经问过很多次了。我还知道如何通过启用应用程序组使用核心数据与应用程序扩展共享单个数据库。我现在正在使用 NSPersistentCloudKitContainer 同
我无法将令人兴奋的核心数据堆栈更改为 NSPersistentCloudKitContainer,因为这只是 iOS 13 及更高版本的支持功能,但我希望为 iOS 13 及更高版本设置该设置,同时为
我正在尝试使用 Core Data 和 CloudKit 构建一个非常基本的应用程序。我在我的 Mac 上登录了我的 CloudKit 帐户,然后按照说明运行 Apple 在他们的 website 上
我正在为我的核心数据应用程序使用 NSPersistentCloudKitContainer。在测试期间,我检查了在设备上所做的更改是否会在几秒钟内同步到 CloudKit。 但是,当我在设备上禁用
我是一名优秀的程序员,十分优秀!