Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Swift protocols and protocol extensions to easily add and delete conforming instances to Spotlight. Blog post can be found here: http://silvandaehn.com/2015/09/25/Simplifying-CoreSpotlight/
import UIKit
import CoreSpotlight
import MobileCoreServices
public typealias Completion = NSError? -> Void
// MARK: - Searchable Protocol
public protocol Searchable {
static var spotlightDomainIdentifier: String { get }
var spotlightIdentifier: String { get }
var spotlightTitle: String { get }
var spotlightDescription: String? { get }
var spotlightImage: UIImage? { get }
var spotlightKeywords: [String]? { get }
}
public extension Searchable {
var spotlightImage: UIImage? { return nil }
var spotlightKeywords: [String]? { return nil }
var searchableItem: CSSearchableItem {
let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeText as String)
attributeSet.title = spotlightTitle
attributeSet.contentDescription = spotlightDescription
attributeSet.keywords = spotlightKeywords
let item = CSSearchableItem(
uniqueIdentifier: spotlightIdentifier,
domainIdentifier: self.dynamicType.spotlightDomainIdentifier,
attributeSet: attributeSet
)
item.expirationDate = .distantFuture()
item.attributeSet.thumbnailData = spotlightImage.flatMap(UIImagePNGRepresentation)
return item
}
func addToSpotlightIndex(
index: CSSearchableIndex = .defaultSearchableIndex(),
completion: Completion? = nil) {
index.indexSearchableItems([searchableItem], completionHandler: completion)
}
func removeFromSpotlightIndex(
index: CSSearchableIndex = .defaultSearchableIndex(),
completion: Completion? = nil) {
index.deleteSearchableItemsWithIdentifiers([spotlightIdentifier], completionHandler: completion)
}
static func deleteAllIndiciesFromSpotlightIndex(
index: CSSearchableIndex = .defaultSearchableIndex(),
completion: Completion? = nil) {
index.deleteSearchableItemsWithDomainIdentifiers([self.spotlightDomainIdentifier], completionHandler: completion)
}
}
extension SequenceType where Generator.Element == Searchable {
func addToSpotlightIndex(
index: CSSearchableIndex = .defaultSearchableIndex(),
completion: Completion? = nil) {
index.indexSearchableItems(self.map { $0.searchableItem }, completionHandler: completion)
}
func removeFromSpotlightIndex(
index: CSSearchableIndex = .defaultSearchableIndex(),
completion: Completion? = nil) {
index.deleteSearchableItemsWithIdentifiers(self.map { $0.spotlightIdentifier }, completionHandler: completion)
}
}

arn00s commented Mar 15, 2016

Thx @daehn, you just saved me hours of work ! 👍

nice code! have you considered making it a Cocoapod?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment