我試圖以線程安全的方式控制網絡活動指示器。Objective-C線程安全計數器
以下是我現在正在做的方式,但我認爲必須有更好的方法來做到這一點。我正在尋找使用鎖,但它看起來像一個昂貴的操作。我一直在看OSAtomicAdd,但不知道如何在這種情況下使用它。
+ (void)start
{
[self counterChange:1];
}
+ (void)stop
{
[self counterChange:-1];
}
+ (void)counterChange:(NSUInteger)change
{
static NSUInteger counter = 0;
static dispatch_queue_t queue;
if (!queue) {
queue = dispatch_queue_create("NetworkActivityIndicator Queue", NULL);
}
dispatch_sync(queue, ^{
if (counter + change <= 0) {
counter = 0;
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
} else {
counter += change;
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}
});
}
怎麼能這樣做使用OSAtomicAdd?
也許你可以使用http://stackoverflow.com/questions/16420340/fixing-my-network-activity-indicator/16420875#16420875一些代碼。 –
@MartinR謝謝,你的回答實際上解決了我的問題。我想確保NumberOfCallsToSetVisible永遠不會變成-1。 NumberOfCallsToSetVisible = 0線程安全還是有一個osatomic集? –
我也喜歡MartinR的答案,但是如果您想要序列化,請在類級setter +(void)setCounter上使用@synchronize(或等價物):並確保在增量時使用setter。 – danh