2017-03-11 1 views
2

Ich habe folgendes Setup für eine kleine Apollo iOS app, wo ich eine Liste von Konferenzen in einer Tabellenansicht angezeigt werden und wollen in der Lage sein, eine Konferenz zur Liste hinzufügen :Automatische Aktualisierungen der Benutzeroberfläche mit Apollo in Swift nicht funktioniert

GraphQL:

query AllConferences { 
    allConferences { 
    ...ConferenceDetails 
    } 
} 

mutation CreateConference($name: String!, $city: String!, $year: String!) { 
    createConference(name: $name, city: $city, year: $year) { 
    ...ConferenceDetails 
    } 
} 

fragment ConferenceDetails on Conference { 
    id 
    name 
    city 
    year 
    attendees { 
    ...AttendeeDetails 
    } 
} 

fragment AttendeeDetails on Attendee { 
    id 
    name 
    conferences { 
    id 
    } 
} 

ConferencesTableViewController:

AddConferenceViewController:

class AddConferenceViewController: UIViewController { 

    // ... IBOutlets 

    @IBAction func saveButtonPressed() { 
    let name = nameTextField.text! 
    let city = cityTextField.text! 
    let year = yearTextField.text! 

    apollo.perform(mutation: CreateConferenceMutation(name: name, city: city, year: year)) { result, error in 
     if let _ = result?.data?.createConference { 
     self.presentingViewController?.dismiss(animated: true) 
     } 
    } 

    } 
} 

ich implementiert auch cacheKeyForObject in AppDelegate wie so:

apollo.cacheKeyForObject = { $0["id"] } 

Meine Frage ist, ob es möglich ist, von der automatischen Aktualisierungen der Benutzeroberfläche mit diesem Setup profitieren ? Derzeit, wenn die CreateConferenceMutation ausgeführt wird, wird die Tabellenansicht nicht aktualisiert. Bin ich etwas fehlt oder bin ich schlagen die Einschränkung, dass in der docs erwähnt wird:

In einigen Fällen nur cacheKeyFromObject verwendet, ist nicht genug, um für Ihre Anwendung UI korrekt zu aktualisieren. Wenn Sie z. B. einer Liste von Objekten etwas hinzufügen möchten, ohne die gesamte Liste erneut abzurufen, oder wenn einige Objekte vorhanden sind, denen Sie keine Objekt-ID zuweisen können, kann Apollo vorhandene Abfragen nicht automatisch für Sie aktualisieren.

Antwort

4

Dies ist in der Tat eine Einschränkung der automatischen UI-Updates. Obwohl Apollo cacheKeyFromObject verwendet, um Objekte nach ID abzugleichen, und dies viele häufige Fälle abdeckt, kann es Listen von Objekten nicht automatisch aktualisieren.

In Ihrem Schema gibt es für Apollo keine Möglichkeit zu wissen, dass eine neu hinzugefügte Konferenz zur allConferences Liste hinzugefügt werden sollte. Alles, was es weiß ist, dass allConferences eine Liste von Konferenzobjekten zurückgibt, aber diese könnten beliebig ausgewählt und geordnet werden.

In solchen Fällen müssen Sie die Abfrage erneut vom Server abrufen oder das Mutationsergebnis ändern, um die aktualisierte Liste aufzunehmen.

Eine andere Option wäre, die neue Konferenz manuell der Liste im Client-Speicher hinzuzufügen. Zu diesem Zweck wird die nächste Version von Apollo iOS eine manuelle Update-Option enthalten, ähnlich der updateQueries im Apollo JavaScript-Client.

Verwandte Themen