由 Ipodishima 开发和维护,他是 Wasappli Inc 的创始人兼技术总监。(如果您需要开发应用,请与我们团队取得联系!)
随着 iOS 9 的发布,带来了许多新功能。其中之一是 CoreSpotlight,其目的是让您能够访问 iOS 本身的应用搜索。现在,用户可以直接从 iOS 的搜索中查找他们的酒店预订,然后回到该应用。
由于许多开发者正在使用 CoreData,我认为帮助使用 CoreSpotlight 和 CoreData API 进行索引是一个很好的想法。
WACoreDataSpotlight 通过快速配置,将自动索引您 core data 数据库。是的,您没有听错。自动。
它将
自动(在一级 save 后)
您可以使用
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
有一个名为 firstName
和 lastName
的属性,其值分别是 Marian
和 Paul
。使用标识符 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 的问题,请在这里 此处 新建一个问题。
对于新功能的拉取请求受到鼓励并受到高度赞赏! 请尽量保持与现有代码样式的一致性。如果您考虑接受项目的大量更改或增减,请先通过新建一个问题与我联系,以便有机会进行合并。