2015-12-08 9 views
9

Ich habe eine App, die Core Spotlight verwendet, um den App-Inhalt zu indizieren. Die Anwendung verwendet auch Core Data, und beim Erstellen einer NSManagedObject die Details des Objekts werden für die CSSearchableItem dann zu der Spotlight Search Index hinzugefügt.Update Spotlight Search Index bei der Arbeit mit Core Data?

Die Sache ist, ich habe den Eindruck, dass es keine Richtungsreferenz auf die NSManagedObject und die CSSearchableItem gibt, also, wenn das Element zum Index hinzugefügt wird, kopiert es nur die Details.

Hier ist ein Beispiel für das Hinzufügen eines Elements zum Index.

//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.") 
     } 
    } 

Nach der Zugabe sind das Element in den Index aller Artikel über Spotlight-Suche durchsucht werden. Eine Funktion in der appDelegate kümmert sich um Aktionen bei der Auswahl von Indexpositionen.

So scheint alles in Ordnung, bis ich die NSManagedObject innerhalb der App bearbeiten oder löschen, weil die Searchable Items Index den Index nicht die Elemente im Index aufgeführten nicht aktualisiert sind nicht auf dem neuesten Stand und noch gelöscht/alte Daten aufzulisten.

Also wie kann ich CSSearchableIndex Artikel aktualisiert halten, wenn ein NSManagedObject aktualisiert wird?

Antwort

1

Sie möchten, dass die Indizierung mit dem Löschen Ihrer Artikel synchron ist. Suchen Sie daher nach diesen drei Methoden, die von der Klasse CSSearchableIndex implementiert werden, um Elemente zu löschen, wenn sie nicht mehr benötigt werden.

  1. deleteAllSearchableItemsWithCompletionHandler (_ :)
  2. deleteSearchableItemsWithDomainIdentifiers (_: completionHandler :)
  3. deleteSearchableItemsWithIdentifiers (_: completionHandler :)

Wie dieses Beispiel

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

4

Index auf dem neuesten Stand zu halten ist ein kritischer Punkt, wenn Sie Ihren Index relevant machen wollen. Sie müssen jedes Mal, wenn Sie eine solche Operation mit Core Data durchführen, Elemente aus dem Index hinzufügen/entfernen. Sie sollten die folgende Methode verwenden, um Elemente vor dem Löschen aus Core Data aus dem Index zu entfernen. Außerdem finden Sie viele nützliche Informationen in CoreSpotlight-Dokumenten.

- deleteSearchableItemsWithIdentifiers:completionHandler:

2

Sie sind auf dem richtigen Weg, wenn Sie die willSave: Methode auf Ihrem NSManagedObject implementieren, wird es auf jeder aufgerufen werden Speichern/Löschen Operation gegen diesen Datensatz. mehr dazu hier

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

Schritte zu folgen:

  1. willSave Methode auf Ihre Kerndaten NSManagedObject Subklassen
  2. Lookup Ihre indizierte Objekt implementieren, die die Kerndaten abbildet Objekt
  3. Aktualisieren/Löschen des Index

Tipp: Wenn Sie Ihre NSManagedObjectID für das Core-Datenobjekt serialisieren (vorausgesetzt, Sie haben die permanente ID für das Objekt vor dem Speichern erhalten), können Sie diese als eindeutigen Bezeichner für Ihr Suchindexelement verwenden, sodass Sie es schnell finden können/updaten

+0

Dies scheint die passendere Antwort zu mir – cdf1982