Обновлять поисковый индекс Spotlight при работе с Core Data?

У меня есть приложение, которое использует Core Spotlight для индексации содержимого приложения. Приложение также использует Core Data, а при создании NSManagedObject детали объекта используются для CSSearchableItem, а затем добавляются к Spotlight Search Index.

Дело в том, что у меня сложилось впечатление, что для NSManagedObject и CSSearchableItem нет ссылки на направление, поэтому, когда элемент добавляется в индекс, он просто копирует детали.

Вот пример добавления элемента в указатель.

//Spotlight Index Search
// Create an attribute set to describe an item.

    let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeData as String)

// Add metadata that supplies details about the item.

    attributeSet.title = "\(object.title)"
    attributeSet.contentDescription = "\(object.description)"

// Create an item with a unique identifier, a domain identifier, and the attribute set you created earlier.
    let item = CSSearchableItem(uniqueIdentifier: "1", domainIdentifier: "ObjectType", attributeSet: attributeSet)

// Add the item to the on-device index.
       CSSearchableIndex.defaultSearchableIndex().indexSearchableItems([item]) { error in

    if error != nil {
      print(error?.localizedDescription)
    }
      else {
      print("Item indexed.")
      }
    }

После добавления элемента в индекс все элементы доступны для поиска с помощью поиска Spotlight. Функция в appDelegate заботится о действиях при выборе элементов указателя.

Таким образом, все выглядит нормально, пока я не отредактирую или не удалю NSManagedObject в приложении, потому что Searchable Items Index не обновляет индекс, элементы, перечисленные в индексе, не обновлены и по-прежнему перечисляют удаленные/старые данные.

Итак, как я могу обновлять CSSearchableIndex элементов при обновлении NSManagedObject?


person RileyDev    schedule 08.12.2015    source источник


Ответы (3)


Вы хотите, чтобы индексация синхронизировалась с удалением ваших элементов. Следовательно, ищите эти три метода, реализованные классом CSSearchableIndex, для удаления элементов, когда они больше не нужны.

  1. удалитьAllSearchableItemsWithCompletionHandler(_:)
  2. deleteSearchableItemsWithDomainIdentifiers(_:completionHandler:)
  3. deleteSearchableItemsWithIdentifiers(_:completionHandler:)

Как этот пример,

CSSearchableIndex.defaultSearchableIndex().deleteSearchableItemsWithDomainIdentifiers(["tv-shows"]) { (error) -> Void in
    if error != nil {
        print(error?.localizedDescription)
    }
    else {
        // Items were deleted successfully
    }
}

person Kumar Utsav    schedule 26.12.2015

Поддержание индекса в актуальном состоянии имеет решающее значение, если вы хотите, чтобы ваш индекс был актуальным. Вы должны добавлять/удалять элементы из индекса каждый раз, когда делаете такую ​​операцию с Core Data. Вы должны использовать следующий метод для удаления элементов из индекса перед удалением из Core Data. Также вы можете найти много полезной информации в документации CoreSpotlight.

- deleteSearchableItemsWithIdentifiers:completionHandler:

person Roman Kabachenko    schedule 21.12.2015

Вы на правильном пути, если вы реализуете метод willSave: в своем NSManagedObject, он будет вызываться при любой операции сохранения/удаления этой записи. больше об этом здесь

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/index.html#//apple_ref/occ/instm/NSManagedObject/willSave

Шаги, чтобы следовать:

  1. Реализуйте метод willSave для ваших основных данных. Подклассы NSManagedObject.
  2. Найдите свой индексированный объект, который сопоставляется с основным объектом данных
  3. Обновить/удалить этот индекс

Совет: если вы сериализуете свой NSManagedObjectID для основного объекта данных (при условии, что вы получили постоянный идентификатор для объекта до его сохранения), вы можете использовать его в качестве уникального идентификатора для вашего элемента поискового индекса, чтобы вы могли быстро найти/ обновить его

person Joseph Afework    schedule 25.12.2015
comment
Это кажется мне более подходящим ответом - person cdf1982; 13.08.2016