目前,我遇到了一个似乎是阻止我的代码继续运行的锁定问题。我怀疑问题是基于 @synchronized 块与 performSelector:AfterDelay: 一起工作的方式。锁是否在延迟中持续存在,或者选择器是否安排在锁之外?
如果您想看一下,这是代码。本质上,locateEvents 被调用了很多次,但实际上只需要在新的事件位置数据进入时每隔一段时间运行一次(即,如果它一直被调用)。
-(void) locateEvents
{
@synchronized(self)
{
if(!locating)
{
locating = true;
shouldLocate = false;
for(Event* e in provider.allEvents)
{
if(e.coordinate.latitude)
[self queueEventForMap:e];
}
[self performSelector:@selector(stopLocating) withObject:nil afterDelay:1.0f];
}else{
shouldLocate = true;
}
}
}
-(void) stopLocating
{
locating = false;
if(shouldLocate)
[self locateEvents];
}