【发布时间】:2013-06-18 18:26:30
【问题描述】:
我正在尝试以线程安全的方式控制网络活动指示器。
这是我目前正在做的方式,但我认为必须有更好的方式来做到这一点。我一直在寻找使用锁,但这似乎是一项昂贵的操作。我一直在研究 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 完成这样的事情?
【问题讨论】:
-
也许你可以使用stackoverflow.com/questions/16420340/…的一些代码。
-
@MartinR 谢谢,您的回答实际上解决了我的问题。我想确保 NumberOfCallsToSetVisible 永远不会变成-1。 NumberOfCallsToSetVisible = 0 线程是安全的还是存在 osatomic 集?
-
我也喜欢 MartinR 的答案,但如果你想在一般情况下进行序列化,请在类级设置器 +(void)setCounter: 上使用 @synchronize (或等效项)并确保使用增加时设置器。
-
无论如何,这是一种间接的欺骗。这个问题有两个答案,既解决了线程安全计数器问题,又演示了如何限制并发网络访问,这很关键。
标签: iphone ios objective-c cocoa-touch