2016-04-03 3 views
0

Ich möchte die Funktionalität zum Hinzufügen eines Beobachters und dessen Entfernung vom View-Controller trennen. Zur Zeit füge ich Beobachter in der viewWillAppear() Methode hinzu und entferne den Beobachter in der viewWillDisappear(). Jetzt möchte ich Light View-Controller haben, um den Beobachtercode von diesem View-Controller zu einer anderen Klasse zu trennen. Ich denke, ich muss eine neue Klasse erstellen und diesen Ansichtscontroller als den neuen Klassendelegaten festlegen, aber ich bin mir nicht sicher. Ich würde es sehr schätzen, wenn mir jemand helfen könnte, wie ich das mache.Separater Beobachtercode von ViewController zu einer anderen Klasse

Antwort

2

Was meinst du mit Beobachter? NSNotifikationsCenter? Vielleicht könnte ein Code-Schnipsel das deutlicher machen?

FWIW ... viewWillAppear() und viewWillDisappear() können mehr als einmal pro Lebensdauer der Ansicht aufgerufen werden, also denken Sie daran. In diesem Scanerio sollte es in Ordnung sein, solange sie ausgeglichen sind.

Ich normalerweise Beobachter hinzufügen/entfernen in init/dealloc (Objc-C) oder init/deinit (Swift) und verwenden Sie isViewLoaded, um sicherzustellen, dass ich nicht die Benutzeroberfläche zu berühren, wenn es nicht da ist, aber es liegt an Ihnen, was Sie bevorzugen.

Für Ihr tatsächliches Beobachtermuster würde ich tatsächlich eine neue Klasse ausarbeiten, um die Beobachterrückrufe zu behandeln. Wenn jedoch die Antwort auf die Callbacks des Betrachters darin besteht, die Benutzeroberfläche des View-Controllers zu aktualisieren, gibt es einige Probleme bei der Trennung von Problemen. Wahrscheinlich wäre es am besten, wenn der View-Controller eine neue Klasse hochfährt, die automatisch auf die NSNotificationCenter-Ereignisse bei der Initialisierung wartet und sich selbst bei dealloc entfernt. Definieren Sie dann ein einfaches @ required-Protokoll als einen schwachen Delegaten der Klasse. Ihr View-Controller kann dieses Objekt erstellen (oder, besser für Testzwecke, bei init in die Abhängigkeit injizieren lassen), diesem Protokoll entsprechen und sich selbst als Delegierter zuweisen.

So etwas wie

@protocol MyObservable { 
@required 
    -(void)myXYZEventDidOccur; 
} 

@interface MyObserver : NSObject { 

-(instancetype)initWithDelegate:(id<MyObservable>)delegate; 

} 

@interface MyObserver() 
    @property (nonatomic, weak, readwrite, nullable) id<MyObservable>delegate; 
} 

@implementation MyObserver { 

    -(instancetype)initWithDelegate:(id<MyObservable)delegate { 
     self = [super init]; 
     if(self == nil) { return nil; } 

     self.delegate = delegate; 

     [NSNotificationCentre defaultCentre] addObserver...]; 
    } 

    -(void)dealloc { 
     [NSNotificationCentre defaultCentre] removeObserver...]; 
    } 

    -(void)didReceiveNotificationXYZ:(NSNotification *)notification { 
     [self.delegate myXYZEventDidOccur]; 
    } 
} 

wirklich intelligent zu erhalten, kann man nicht einmal die Mühe zu beobachten, bis Sie einen Delegaten festgelegt haben. Ebenso, hör auf zu beobachten, wenn es keinen Delegierten gibt.

+1

Ja, NSNotificationCenter. Ich verstehe, dass Beobachter beim Aufruf von viewWillAppear() oder ViewWillDisappear() erstellt und freigegeben werden. Dadurch kann ich die Erinnerung für den Betrachter freigeben, wenn ich aus der Sichtweite komme. Und kann die Dealloc() nicht verwendet werden, wenn ARC aktiviert ist. –

+0

Dealloc ist in einer ARC-Welt vollkommen legitim, aber die Art und Weise, wie Sie es verwenden, wird subtil geändert. Weitere Informationen finden Sie unter [dealloc] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/index.html#//apple_ref/occ/instm/NSObject/dealloc) im Grunde, verwenden Sie es nicht für die Verwaltung begrenzter Ressourcen und rufen Sie nicht super. – Michael

+1

Können Sie beschreiben, in welchen Situationen viewWillDisappear() und viewWillAppear() den Code bricht. Ich habe einige Links überprüft, die vorgeschlagen haben, diese Methoden zum Hinzufügen oder Entfernen des Beobachters zu verwenden. Siehe hier: [Link1] (http://www.daveoncode.com/2011/12/12/quick-ios-tip-where-is-the-right-place-to-add-and-remove-observers-in -uiviewcontrollers /), [Link2] (http://stackoverflow.com/questions/10631375/whats-the-better-way-to-addobserver-removeobserver-with-nsnotificationcenter). –

Verwandte Themen