2017-03-11 1 views
2

を動作していません:自動UIの更新は私がテーブルビューに<em>会議</em>のリストを表示し、リストに<em>会議</em>を追加できるようにしたい小さなアポロiOSアプリのための次のセットアップを持っている

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

class ConferencesTableViewController: UITableViewController { 

    var allConferencesWatcher: GraphQLQueryWatcher<AllConferencesQuery>? 

    var conferences: [ConferenceDetails] = [] { 
    didSet { 
     tableView.reloadData() 
    } 
    } 

    deinit { 
    allConferencesWatcher?.cancel() 
    } 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    allConferencesWatcher = apollo.watch(query: AllConferencesQuery()) { result, error in 
     print("Updating conferences: ", result?.data?.allConferences) 
     guard let conferences = result?.data?.allConferences else { 
     return 
     } 
     self.conferences = conferences.map { $0.fragments.conferenceDetails } 
    } 
    } 

    // ... 
    // standard implementation of UITableViewDelegate 
    // ... 

} 

AddConferenceViewController

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

私の質問には、この設定で自動UIのアップデートの恩恵を受けることが可能であるかどうかです:

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) 
     } 
    } 

    } 
} 

そうは次のように私はまた、AppDelegatecacheKeyForObjectを実装?現時点ではが実行されると、テーブルビューは更新されません。私が何かをしないのですか私はdocsに記載されている制限当たっています:アプリケーションのUIを正しく更新するためだけcacheKeyFromObjectを使用して、いくつかのケースでは

するだけでは十分ではありません。たとえば、リスト全体を再編集せずにオブジェクトのリストに何かを追加したい場合や、オブジェクト識別子を割り当てることができないオブジェクトがある場合、Apolloは自動的に既存のクエリを更新することはできません。

答えて

4

これは本当に自動UI更新の制限です。 ApolloはIDでオブジェクトを照合するのにcacheKeyFromObjectを使用していますが、多くの一般的なケースをカバーしていますが、オブジェクトのリストを自動的に更新することはできません。

あなたのスキーマでは、新しく追加された会議をallConferencesリストに追加する必要があることをApolloが知る方法はありません。それが知っていることは、allConferencesが会議オブジェクトのリストを返すことですが、これらは任意に選択して並べ替えることができます。

これらのような場合は、サーバーからクエリを再フェッチするか、突然変異結果を変更して更新されたリストを含める必要があります。

もう1つの方法は、新しい会議をクライアントストアのリストに手動で追加することです。このため、Apollo iOSの次のバージョンには、Apollo JavaScriptクライアントのupdateQueriesに似た手動アップデートオプションが含まれています。

関連する問題