Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用CoreData将远程搜索结果与本地数据库连接_Ios_Objective C_Swift_Uitableview_Core Data - Fatal编程技术网

Ios 使用CoreData将远程搜索结果与本地数据库连接

Ios 使用CoreData将远程搜索结果与本地数据库连接,ios,objective-c,swift,uitableview,core-data,Ios,Objective C,Swift,Uitableview,Core Data,假设我们有一个单一实体的简单数据模型用户;简单的tableView\u friends和fetchedResultsController\u friends用于显示用户-朋友 假设我们有搜索栏来搜索服务中的所有(不仅仅是朋友)用户,并且对于每个输入的字符,我们向服务器执行搜索请求,这些字符以某种方式通过字符用户对象过滤返回给我们。其中一些对象可能已经在本地数据库中。根据应用程序逻辑,我们实际上不必永远将所有这些结果保存在本地数据库中(但好的,我们可以,我们可以不时清除本地数据库);另一方面,若要

假设我们有一个单一实体的简单数据模型
用户
;简单的
tableView\u friends
fetchedResultsController\u friends
用于显示用户-朋友

假设我们有搜索栏来搜索服务中的所有(不仅仅是朋友)用户,并且对于每个输入的字符,我们向服务器执行搜索请求,这些字符以某种方式通过字符用户对象过滤返回给我们。其中一些对象可能已经在本地数据库中。根据应用程序逻辑,我们实际上不必永远将所有这些结果保存在本地数据库中(但好的,我们可以,我们可以不时清除本地数据库);另一方面,若要对某个搜索到的用户执行任何操作,则必须存储该用户。我们想用
fetchedResultsController\u search
在其他
tableView\u search
中显示搜索用户的列表


问题:我应该为
fetchedResultsController\u好友
fetchedResultsController\u搜索
使用相同的上下文吗?若并没有,那个么当我想要编辑搜索到的用户时,我该如何处理这种情况呢?这个用户已经存在于数据库中,并且可能已经在本地编辑过了?如果是,我如何为
fetchedResultsController\u search
(服务器执行其自己的字符搜索逻辑,可以更改)设置谓词以显示与服务器完全相同的结果?

我们最近在应用程序中实现了一个搜索功能,并遇到了类似的问题,我们在核心数据中有本地数据,也有来自API的远程数据

我们探讨了您的一些选择:

  • 在检索和保存数据时,将数据从API保存到核心数据中 然后,获取的结果控制器将完成其余的工作
  • 自己管理数据的合并,您仍然可以在一定程度上使用NSFetchedResults控制器,但需要做更多的工作
  • 我们不想保存API返回的所有信息,除非需要(用户选择了它),所以我们提出了一个简单的解决方案,适用于我们的应用程序。这可能不会直接适用于你的应用程序,你可能需要一个完全不同的解决方案,或者改变我们所做的一些事情来适应

    首先,为了解释我们要处理的是什么,我们在核心数据中有一个Article实体,它包含大约25个属性,API使用相同的数据返回Article对象作为JSON数据

    我们决定创建一个类,该类表示一篇文章的简单版本(刚好有足够的数据显示在列表视图中,稍后在API或核心数据中引用),如下所示:

    class SearchResult: NSObject {
    
        var id:String?
        var title:String?
        var imageUrl:String?
        var url:String?
    
        // core data entity
        init(article:Article) {
            self.id = content.contentId
            self.title = content.title
            self.featuredImageURL = content.absoluteImagePath()
            self.urlAlias = content.urlAlias
            self.publishedAt = content.publishedAt
        }
    
        init(articleDictionary:NSDictionary) {
            self.id = articleDictionary.objectForKeyNotNull("id") as? String
            self.title = articleDictionary.objectForKeyNotNull("title") as? String
            self.url = articleDictionary.objectForKeyNotNull("url") as? String
    
            if let imageUrl = articleDictionary.objectForKeyNotNull("imageUrl") as? String {
                self.imageUrl = imageUrl
            }
        }
    }
    
    现在使用这个,我们可以从核心数据结果或API结果创建其中一个。我们的tableview数据源只是一个数组

    var dataSet = [SearchResult]()
    
    我们使用NSFectchResultsController委托方法在初始加载后从数据集中添加/删除/重新排序核心数据元素,当我们获得API数据时,我们将执行以下操作:

    dataSet = Array(Set(apiResponseArray + dataSet))
    
    这将从API中获取一组SearchResult项,将它们与当前结果集合并并删除重复项。强制转换到一个集合,然后再转换回一个数组,将得到一个唯一结果数组,因为集合仅由唯一值组成


    请看这篇文章,这将有助于了解委托方法的工作方式

    谢谢您的精彩回答!我是对的,你们保持服务器上的搜索方法清晰,并在应用程序中断言本地数据库的工作完全相同?您是一步接收到来自服务器的所有搜索请求数据还是一部分接收到的?如果我滚动到25.000行,那么
    dataSet.count
    将>=25.000,我的想法对吗?我们对远程API搜索结果进行分页,这样我们一次可以收到大约20个,并且可以滚动到任意数量。如果您正在搜索本地内容和远程数据,您应该真正了解搜索大致相同,以获得相关结果。如果您滚动到一行25k,那么是的,您的计数可能是25k,因为服务器上不可能有任何本地内容。让我想象一下,您有标题为aaa和azz的文章,存储在本地数据库中,并且您执行对键“a”的远程搜索。这是否意味着,在每次请求之后(直到您从服务器获得一篇azz文章),您的
    表视图中的最后一行总是有azz文章?我在
    表视图中的意思是这样的:第一个请求:aaa,aab,aac,…,aay,azz;第二个请求:aaa、aab、aac、…、aay、aaz、aba、abb、…、abx、AZITT取决于您的实施情况,我们按发布日期对内容进行排序