我想创建一个只运行一次的函数,如果仍在运行则取消。
我在开始/结束时使用一个简单的锁布尔值尝试了它,但有时它是“重叠”。
有更好更安全的方法吗?
@property (assign) BOOL lock;
- (void)myFuntion
{
if (self.lock) {
NSLog(@"(Canceled) Syncing is already running...");
return;
}
self.lock = YES;
// My Code
self.lock = NO;
}
答案 0 :(得分:3)
NSLock
课程应该可以在这里帮助你。我没有直接尝试这个例子,但是像:
NSLock *myFunctionLock=[NSLock new]; // this should be a class data member/property/etc.
- (void)myFuntion
{
if (![myFunctionLock tryLock])
return; /* already running */
// My Synchronized Code
[myFunctionLock unlock];
}
答案 1 :(得分:1)
我们都假设你在谈论并发编程,你在不同的线程上运行相同的代码。如果那不是你的意思那么你需要解释你的意思,因为在同一个线程上运行的代码只能在任何特定时刻执行一次。
查看NSLock
的{{1}}功能。断言锁定的第一个调用者返回TRUE,并且可以继续访问关键资源。其他呼叫者返回FALSE并且不应该访问关键资源,但不会阻止。