@synground中的@synchronized块和选择器以及afterDelay

时间:2013-01-22 06:27:16

标签: iphone ios objective-c asynchronous thread-safety

目前我遇到了阻止我的代码继续运行的锁定问题。我怀疑问题是基于@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];

}

1 个答案:

答案 0 :(得分:0)

经过一些额外的测试后,似乎锁定不遵循预定的选择器。我上面遇到的问题是由线程死亡和未启动的预定选择器引起的。