如何保留主题 ID,在 TableViewCell 中标记为已完成

Posted

技术标签:

【中文标题】如何保留主题 ID,在 TableViewCell 中标记为已完成【英文标题】:How to persist Topics ID, Which marked as completed in TableViewCell 【发布时间】:2020-05-07 04:48:35 【问题描述】:

我想在 TableView 中跟踪已完成的主题列表

我已设置委托,确认 tableView 主题标记为已完成

protocol TopicDetialVCDelegate: class 
func hasBeenCompletedTopic()

TableViewVC

func hasBeenCompletedTopic() 
    isPerformedDelegate = true
    if !completedTopicIdArray.contains(completedTopicId) 
        completedTopicIdArray.append(completedTopicId)
    
    print("completed Topics \(completedTopicIdArray)")
    print("TopicVC: Completed Topics total: \(completedTopicIdArray.count)")

这是可行的,但我想坚持始终将已标记的标记为已完成

这是 CellForRowAt 的代码

  if isPerformedDelegate 
        for _ in 0...completedTopicIdArray.count 
            if completedTopicIdArray.contains(filteredTopicArray[indexPath.row].id!) 
                cell.topicCompletedTickImageView.image = #imageLiteral(resourceName: "Tick")
            
        
    

我想要什么

应该有一个数组来获取所有已完成的主题 idz,并在每次运行应用程序时检查单元格索引路径是否包含 topicID 显示 Tick 图像

我可以像这样使用 UserDefaults

UserDefaults.standard.set(array, forkey: "abc")

但问题是数组将在应用程序再次运行时重新初始化

就像在 ViewWillDisappear 中一样

 override func viewWillDisappear(_ animated: Bool) 
    UserDefaults.standard.set(completedTopicIdArray, forKey: "completedTopics")
    UserDefaults.standard.synchronize()

在 ViewDidLoad 中访问

let topics = UserDefaults.standard.array(forKey: "completedTopics")
    print(topics as? [Int] ?? [Int]())

【问题讨论】:

UserDefaults 并不是用于简单设置(顾名思义)之外的任何事情的最佳数据存储。你应该看看像 Core Data 这样的东西;然后,您将存储许多 Topic 实体,每个实体都有一个 isCompleted bool 属性。但是,您的问题似乎是在应用启动时如何从用户默认值加载数据 - 您可以显示该代码吗? 你在哪里得到/设置completedTopicIdArray到UserDefaults? @TraiNguyen 在 ViewWillAppear 和 ViewWillDisappar 中 @Paulw11 这是我在问如何持久化数据,我可以在应用程序启动时访问,它是一个数组,因此我举了一个 UserDefaults 的例子。无论如何,所以我应该使用主题 id 和 iscompleted bool 类型创建一个实体? @UmerKhan 您可以将带有加载/保存completedTopicIdArray 的源代码发布到 UserDefaults 吗? 【参考方案1】:

我已经使用 CoreData 解决了这个问题,希望分享

声明空数组

 var completedTopicsIdPersistArray: [Int]    = [Int]()

CoreData 创建方法

func persistIdIntoCoreData()

    guard let appDelegate    = UIApplication.shared.delegate as? AppDelegate else  return 
    let managedObjectContext = appDelegate.persistentContainer.viewContext

    guard let entity = NSEntityDescription.entity(forEntityName: "ComTopicDB", in: managedObjectContext)
        else 
            print("Entity Not Found")
            return
    

    let topicIdz = NSManagedObject(entity: entity, insertInto: managedObjectContext)
                topicIdz.setValue(completedTopicId, forKey: "topicId")

    do 
        try managedObjectContext.save()
    
    catch let error as NSError 
        print("Unable to save into CoreData: \(error.userInfo)")
    

CoreData 检索方法

func retrieveIdFromCoreData() 

    guard let appDelegate    = UIApplication.shared.delegate as? AppDelegate else  return 
    let managedObjectContext = appDelegate.persistentContainer.viewContext
    let fetchRequest         = NSFetchRequest<NSManagedObject>(entityName: "ComTopicDB")

    do 
        let topicIdz = try managedObjectContext.fetch(fetchRequest)
        for id in topicIdz 

            let unwrapId = id.value(forKey: "topicId") as! Int
            if !completedTopicsIdPersistArray.contains(unwrapId) 
                completedTopicsIdPersistArray.append(unwrapId)
            
        
    
    catch let error as NSError 
        print("Found issue during retrieve id from CoreData:\(error.userInfo)")
    

在委托方法内部调用,确认主题完成

func hasBeenCompletedTopic() 
    isPerformedDelegate = true
    if !completedTopicIdArray.contains(completedTopicId) 
        completedTopicIdArray.append(completedTopicId)
        persistIdIntoCoreData()
    
    print("completed Topics \(completedTopicIdArray)")
    print("TopicVC: Completed Topics total: \(completedTopicIdArray.count)")
    retrieveIdFromCoreData()

最后是 CellForRowAt 方法

if completedTopicsIdPersistArray.contains(filteredTopicArray[indexPath.row].id!) 
        cell.topicCompletedTickImageView.image = #imageLiteral(resourceName: "Tick")
    

最后在ViewWillAppear里面调用,因为是从topicDetailVC回来的

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)
    tableView.reloadData()
    retrieveIdFromCoreData()

现在所有主题都会显示 Tick 图标,标记为已完成,甚至终止并重新启动应用程序

【讨论】:

以上是关于如何保留主题 ID,在 TableViewCell 中标记为已完成的主要内容,如果未能解决你的问题,请参考以下文章

如何在 kafka 中查看特定主题的保留情况

如何在使用 Spring 创建期间配置 kafka 主题保留策略?

如何添加本地存储以在 Gatsby 中保留暗模式主题

使 Kafka 主题日志保留永久化

从以编程方式创建的tableViewCell中删除图像

discuz 批量删除回复并且保留主题的方法,亲测3.4版本通过