簡體   English   中英

iOS Objective C覆蓋屬性設置器

[英]iOS Objective C Override Property Setter

在課堂上,我有@property BOOL clearCookies;

我想進行設置,以便在設置項目時可以做一些其他事情。

在我的代碼中,我可以做類似classInstance.clearCookies = YES;

然后在setter方法中,類似於android中的以下Java示例:

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

在目標C中實現此目標的最佳方法是什么? 基本上,我想設置boolean屬性,然后再做一些其他事情(實際上是從UIWebView清除cookie)

您可以這樣:

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

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

避免線程沖突的另一種方法( @synchronized()替代方法)是使用Grand Central Dispatch(在大多數情況下,它比前者 ):

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

如果您不關心線程,或者不需要線程,那么只需覆蓋您的setter就可以了:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM