我试图以线程安全的方式控制网络活动指示器。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