2016-04-15 3 views
2

Ich versuche den richtigen Weg zu finden, einen View-Controller zu benachrichtigen, dass er Daten vom Server basierend auf einer Aktion eines anderen View-Controllers abrufen soll.Wie kann ein View-Controller wissen, dass er Daten vom Server abrufen soll?

Zum Beispiel - eine Ansicht-Controller, der eine Liste von Tweets präsentiert und einen View-Controller, die dem Benutzer erstellen ein Tweet lässt. Nachdem der Benutzer einen Tweet erstellt hat, wird der Ansichtscontroller, der für verantwortlich war, der Tweet gelöscht und der Ansichtscontroller, der für den Tweet darstellt, sollte nun bewusst sein, dass es seine Daten vom Server neu laden sollte Um dem Benutzer den Tweet zu präsentieren, den er gerade erstellt hat.

Zuerst dachte ich NSNotificationCenter ist der Weg zu gehen, aber nach einer wenig Forschung zu tun (vor allem this twitter discussion), fand ich, dass es empfohlen wird, um die Benachrichtigung Beobachter im viewDidDisappear Methode der View-Controller zu entfernen, die in dem Szenario, das oben beschrieben wird, macht die Benachrichtigung unbrauchbar, weil der präsentierende View-Controller sich bereits von den Beobachtern der Benachrichtigung zu dem Zeitpunkt entfernen würde, zu dem er sie empfangen sollte (weil er durch den 'create tweet' View-Controller verborgen wird wodurch es viewDidDisappear Methode wird aufgerufen).

Delegierung ist auch ein Problem hier, weil es möglicherweise andere Ansichtscontroller gibt, die auch wissen müssen, wann ein neuer Tweet erstellt wurde, um ihre Ansichten zu aktualisieren/Daten vom Server abrufen usw.

Aufgrund der Tatsache, dass der beschriebene Fluss sehr beliebt ist, dachte ich, es muss eine korrekte Weise, diese beiden Ansicht Controller kommunizieren auf eine Weise, die Sinn machen.

Irgendwelche Ideen?

+0

Sie die Beobachter in dealloc Methode entfernen – heximal

+0

Wäre es von NSNotificationCenter sein nicht falsch Nutzung? Gibt es potenzielle Probleme, die auftreten können? – Itamar

+0

Ich sehe nichts kriminelles, außer die Geschäftslogik. – heximal

Antwort

1

Sie können ein Flag in Ihrem Daten-/Netzwerkmodell festlegen. Angenommen, Sie haben eine TweetNetworking.swift Datei, die Ihre Serveranforderungen enthält, können Sie eine var needFeedRefresh: BOOL hinzufügen.

Dann ist es nur eine Frage der Einstellung true, wenn Sie benötigen, und false, sobald Sie den Feed aktualisiert haben. Sie können dann gegen diese Variable in viewWillAppear überprüfen.

Sie können diese Variable auch als NSDate eingeben, wenn Sie regelmäßige Aktualisierungen benötigen, und sie auf NSDate(timeIntervalSince1970:0) einstellen, wenn eine Aktualisierung erzwungen werden muss.

1

Wenn das einzige Hindernis NSNotificationCenter zu verwenden, ist die Tatsache, dass Beobachter in viewDidDisapper entfernt sind, können Sie bewegen removeObserver-deinit anrufen, vorausgesetzt, dass Ihr Beobachter nur versteckt ist und nicht freigegeben.

Weitere Informationen finden Sie unter: iOS8: Where To Remove Observer for NSNotification in Swift (es ist ein Beitrag des gleichen Autors wie die von Ihnen erwähnte Tweet-Diskussion).

0

Sie können den Benachrichtigungslistener auch im präsentierenden Ansichtscontroller hinzufügen, wenn Sie den anderen Ansichtscontroller zum Erstellen von Tweet anzeigen. Dann entfernen Sie diesen Listener im Rückruf. dann wird der Zuhörer so schnell wie möglich entfernt.

func showTweetComposer() { 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(UIPresentingViewController.tweetComposed(_:)), name: UITweetComposeViewControllerDoneKey, object: nil) 
} 

func tweetComposed(notification: NSNotification) { 
    NSNotificationCenter.defaultCenter().removeObserver(self, name:notification.name, object: nil) 
} 
Verwandte Themen