WACoreDataSpotlight 0.0.7

WACoreDataSpotlight 0.0.7

测试已测试
语言语言 Objective-CObjective C
许可证 MIT
发布上次发布2016年4月

Marian Paul 维护。



Ipodishima 开发和维护,他是 Wasappli Inc 的创始人兼技术总监。(如果您需要开发应用,请与我们团队取得联系!)

目的

随着 iOS 9 的发布,带来了许多新功能。其中之一是 CoreSpotlight,其目的是让您能够访问 iOS 本身的应用搜索。现在,用户可以直接从 iOS 的搜索中查找他们的酒店预订,然后回到该应用。

由于许多开发者正在使用 CoreData,我认为帮助使用 CoreSpotlight 和 CoreData API 进行索引是一个很好的想法。

WACoreDataSpotlight 通过快速配置,将自动索引您 core data 数据库。是的,您没有听错。自动。

它将

  • 创建索引,
  • 更新索引条目,
  • 从索引中删除条目。

自动(在一级 save 后)

兼容性

  • Xcode 7 或更高版本
  • iOS 7 或更高版本(在 iOS < 9 上,索引器将返回 nil)

安装和使用

测试它!

您可以使用

pod try WACoreDataSpotlight

然后,当应用启动时,返回主屏幕,搜索 Marian Paul 例如,也可以搜索 employee

安装

设置索引器

导入

#import <WACoreDataSpotlight/WACoreDataSpotlight.h>

分配一个新的索引器

为了分配索引器,您需要一个有效的 NSManagedObjectContext,您可以使用它来创建 / 获取等您 core data 对象。

self.mainIndexer = [[WACDSIndexer alloc] initWithManagedObjectContext:mainContext];

创建一些映射

接下来,您需要创建一些映射。如果内容简单,您可以使用 WACDSSimpleMapping,如果需要更多对 CSSearchableItemAttributeSet 的访问,则可以使用 WACDSCustomMapping

我们从简单的开始

WACDSSimpleMapping *employeeSearchMapping =
[[WACDSSimpleMapping alloc] initWithManagedObjectEntityName:@"Employee"
                                    uniqueIdentifierPattern:@"employee_{#firstName#}_{#lastName#}"
                                               titlePattern:@"{#firstName#} {#lastName#}"
                                  contentDescriptionPattern:@"{#firstName#} {#lastName#} is working as {#jobTitle#} on {#company.name#}"
                                           keywordsPatterns:@[@"employee", @"{#firstName#}", @"{#lastName#}"]
                                       thumbnailDataBuilder:^NSData *(Employee *employee) {
                                            return UIImagePNGRepresentation([UIImage imageNamed:employee.avatarImageName]);
                                       }];

首先,传递一个 Employee 类,它是 NSManagedObject 的子类。然后,您需要传递一个唯一标识符模式。它用于在索引中以唯一方式识别您的对象。最好的选择是使用 itemID 属性。

让我们来看看语法。假设 Employee 有一个名为 firstNamelastName 的属性,其值分别是 MarianPaul。使用标识符 employee_{#firstName#}_{#lastName#} 将映射到 employee_Marian_Paul

{#object property name#} 是使此操作正确工作所需使用的语法。

titlePattern 是强制性的。

关键字可以是硬编码值(employee)或动态值({#firstName#})。

注册映射

[self.mainIndexer registerMapping:employeeSearchMapping];

使用索引器

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler {
    NSManagedObject *object = [self.mainIndexer objectFromUserActivity:userActivity];

    // Do something with the object

    return YES;
}

构建应用程序

构建并运行应用程序。现在,您在其类中添加了映射的所有对象现在将自动添加/更新/从索引中删除... !

自定义索引器

您可以使用自定义映射创建自己的属性集。例如

WACDSCustomMapping *companyMapping =
[[WACDSCustomMapping alloc] initWithManagedObjectEntityName:@"Company"
                                    uniqueIdentifierPattern:@"company_{#name#}"
                          searchableItemAttributeSetBuilder:^CSSearchableItemAttributeSet *(Company *company) {
                               CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeText];
                              attributeSet.title                         = company.name;
                              attributeSet.contentDescription            = [NSString stringWithFormat:@"The company has its offices in %@ and its primary activity is %@.\n%ld employees", company.address, company.activity, [company.employees count]];
                              attributeSet.keywords                      = @[@"company", company.name, company.activity];

                              return attributeSet;
                          }];
[self.mainIndexer registerMapping:companyMapping];

索引现有对象

您可以使用 [self.indexer indexExistingObjects:existingObjects]; 来索引现有对象。请注意,这取决于您在应用程序的生命周期中只调用一次。

更新索引

假设您有一个需要从 URL 下载图像的对象。索引将下订单下载图像,但最终您需要刷新索引以传递图像。

[self.mainIndexer updateIndexingForObject:company];

使用搜索中的活动和对象执行某些操作

当用户点击搜索结果时,您可以使用 [self.mainIndexer objectFromUserActivity:userActivity] 获取对象。但接下来呢?

例如,您可以使用 (WAAppRouting)[https://github.com/Wasappli/WAAppRouting] 在您的应用程序中添加一些 URL 交互。这就像做这样一样简单

self.router = [WAAppRouter defaultRouter];
[self.router.registrar
  registerAppRoutePath:@"companies{CompaniesTableViewController}/:companyName{EmployeesTableViewController}/:employeeID{EmployeeFormViewController}!"
  presentingController:nav];

然后在 application: continueUserActivity: restorationHandler:

NSManagedObject *object = [self.mainIndexer objectFromUserActivity:userActivity];

if ([object isKindOfClass:[Company class]]) {
    [AppLink goTo:@"companies/%@", ((Company *)object).name];
}

if ([object isKindOfClass:[Employee class]]) {
    [AppLink goTo:@"companies/%@/%@", ((Employee *)object).company.name, ((Employee *)object).employeeID];
}

待办事项

  • [ ] 处理批处理
  • [ ] 处理安全实现(在扩展中)

贡献 : 问题,建议,拉取请求?

如果您遇到特定于 WACoreDataSpotlight 的问题,请在这里 此处 新建一个问题。

对于新功能的拉取请求受到鼓励并受到高度赞赏! 请尽量保持与现有代码样式的一致性。如果您考虑接受项目的大量更改或增减,请先通过新建一个问题与我联系,以便有机会进行合并。

就是这些!

  • 如果你开心,请不要犹豫,给我发送一条推文 @ipodishima
  • 遵照MIT许可协议分发。
  • Facebook 上关注 Wasappli。