2017-04-04 5 views
0

In einer Klasse Ich habe @property BOOL clearCookies;iOS Objective C Aufschalten Property Setter

Ich mag würde es so einrichten, dass ich ein paar zusätzliche Dinge tun kann, wenn das Element gesetzt.

In meinem Code könnte ich so etwas wie classInstance.clearCookies = YES;

Dann in der Setter-Methode so etwas wie dieses Java-Beispiel von android tun:

public void setClearCookies(boolean clearCookies) { 
     _instance.clearCookies = clearCookies; 
     _instance.doOtherThings(); 
    } 

Was ist der beste Weg, dass in Objective C zu erreichen? Grundsätzlich möchte ich die Boolesche Eigenschaft setzen, aber dann tun auch einige andere Dinge (eigentlich das Löschen der Cookies von meinem UIWebView)

Antwort

2
-(void)setClearCookies:(BOOL)clearCookies 
{ 
    @synchronized(self) 
    { 
     _clearCookies = clearCookies; 
     [self doOtherThings]; 
    } 
} 

- (BOOL)clearCookies 
{ 
    @synchronized (self) 
    { 
     return _clearCookies; 
    } 
} 
+0

Sieht perfekt aus! Danke für die schnelle Antwort! –

+0

Gern geschehen, Kumpel! –

+0

Sieht so aus, als hätte es keinen synthetischen Getter: 'Beschreibbare atomare Eigenschaft kann synthetisierten Getter nicht mit einem benutzerdefinierten Setter verbinden. Würde es Ihnen etwas ausmachen, ein Beispiel dafür zu geben, wie man einen Getter dafür schreibt? :) –

1

Sie können wie folgt tun:

-(void)setClearCookies:(BOOL)clearCookies { 
     _clearCookies = clearCookies; 
     [self doOtherThings]; 
    } 
+0

Ist das nicht Java? :) –

+0

@TomHammond haha ​​aktualisierte Syntax - Java/Swift Verwirrung - endlich korrigiert: D – sanjana

1

Ein anderer Weg, Thread-Konflikte zu vermeiden (alternativ zu @synchronized()) wird unter Verwendung von Grand Central Dispatch (die in der Mehrzahl der Fälle faster als der erstgenannte ist):

@property (assign, nonatomic) BOOL clearCookies; 

// Later in code 
static dispatch_queue_t clearCookiesQueue; 

- (void)setClearCookies:(BOOL)clearCookies { 
    [self initializeClearCookiesQueue]; 

    dispatch_async(clearCookiesQueue, ^{ // Note, this is "async" 
     _clearCookies = clearCookies; 
    }); 
} 


- (BOOL)clearCookies { 
    [self initializeClearCookiesQueue]; 

    __block BOOL clearCookies; 
    dispatch_sync(clearCookiesQueue, ^{ // Note, this is "sync" 
     clearCookies = _clearCookies; 
    }); 

    // As "sync" waits until the operation is finished, you can define 
    // your other operations here safely. 
    [self doOtherStuff]; 

    return clearCookies; 
} 


/** 
    Checks if the queue for the clearCookies property is initialized and, 
    if it's not, initializes it. 
*/ 
- (void)initializeClearCookiesQueue { 
    if (! clearCookiesQueue) { 
     // We'll use a serial queue to avoid conflicts reading/writing the ivar 
     clearCookiesQueue = dispatch_queue_create("com.yourapp.yourviewcontroller.someUniqueIdentifier", DISPATCH_QUEUE_SERIAL); // Note, this is a C string, not NSString 
    } 
} 

Wenn Sie sich nicht für Threading interessieren, oder Sie es nicht brauchen, genügt es, Ihren Setter zu überschreiben:

- (void)setClearCookies:(BOOL)clearCookies { 
    _clearCookies = clearCookies; 
    [self doOtherStuff]; 
}