2

現在、コードの実行を妨げているロックの問題と思われる問題が発生しています。この問題は、@synchronized ブロックが performSelector:AfterDelay: で機能する方法に基づいていると思われます。ロックは遅延の間持続しますか、それともセレクターはロックの外でスケジュールされますか?

ご覧になりたい場合は、ここにコードがあります。基本的に、locateEvents は何度も呼び出されますが、新しいイベントの場所のデータが入ってくるたびに (つまり、呼び出され続ける場合)、実際に実行する必要があるのは 1 回だけです。

-(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];

}
4

1 に答える 1

0

いくつかの追加テストの後、ロックはスケジュールされたセレクターに従わないようです。上記の問題は、スレッドが死んで、スケジュールされたセレクターが起動されないままになっていることが原因でした。

于 2013-01-22T07:54:56.050 に答える