2015-02-05 1 views
1

Я хочу вставить таймер, чтобы избежать изменения обратно между «далеким», «близким», «немедленным» состоянием.didRangeBeacons Делегат вызывает CLProximityNear и CLProximityFar слишком быстро

Я использую тот же вид для «далекого» и «ближнего» состояний, но я нажимаю новый вид для немедленного состояния.

Таким образом, для немедленного случая для возвращения в корень, у меня есть найти решение, делая это:

[self performSelector:@selector(patchSelectorPopToRoot) withObject:nil afterDelay:4]; 

Как я могу сделать для «ближнего» и «дальнего» состояние, если я использую тот же вид ?

Это делегат:

-(void)beaconManager:(ESTBeaconManager *)manager 
    didRangeBeacons:(NSArray *)beacons 
      inRegion:(ESTBeaconRegion *)region 
{ 
    // Descriptor on distance to sort the array of beacons by distance 
    NSSortDescriptor *sortDescriptor; 
    sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"distance" ascending:YES]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

    // Sorting the array of beacons 
    // Beacon array is sorted based on distance 
    // Closest beacon is the first one 
    self.beaconsArray = [beacons sortedArrayUsingDescriptors:sortDescriptors]; 

    if([self.beaconsArray count] > 0) 
    { 

     if(!self.selectedBeacon) 
     { 
      // initialy pick closest beacon 
      self.selectedBeacon = [beacons objectAtIndex:0]; 
      currentBeaconMinor = self.selectedBeacon.minor; 
     } 
     else 
     { 

      //Sorting the array of beacons 
      self.beaconsArray = [beacons sortedArrayUsingDescriptors:sortDescriptors]; 

      //Updating the selected beacon with the first element of the array (closest beacon) 
      if(self.selectedBeacon != [beacons objectAtIndex:0]) 
      { 
       self.selectedBeacon = [beacons objectAtIndex:0]; 
       currentBeaconMinor = self.selectedBeacon.minor; 
      } 

     } 

     // Switch on proximity of the closest beacon 
     switch (self.selectedBeacon.proximity) 
     { 
      case CLProximityUnknown: 
      { 
       [self DoOnProximityUnknow]; 

       break; 
      } 
      case CLProximityImmediate: 
      { 
       [self DoOnProximityImmediate]; 

       break; 
      } 
      case CLProximityNear: 
      { 
       [self DoOnProximityNear]; 

       break; 

      } 
      case CLProximityFar: 
      { 
       [self DoOnProximityFar]; 

       break; 
      } 

      default: 
       break; 

     } 
     self.beaconsArray = [beacons sortedArrayUsingDescriptors:sortDescriptors]; 
    } 
} 

это метод, в котором я хочу использовать таймер (Near).

-(void)DoOnProximityNear 
{ 
    //Starting a timer 

    //not working : 
    //[NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(timerCalled) userInfo:nil repeats:NO]; 


    //not working 
    /* 
    double delayInSeconds = 20.0; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     NSLog(@"Do some work"); 
    });*/ 
} 

Я просто хочу, чтобы таймер 20 секунд находился внутри моего метода «Near». Я хочу остаться не менее 20 секунд, прежде чем вернуться на «Дальний».

Куда мне вставить этот таймер? Должен ли я ждать длинного сигнала, запускать таймер и ждать другого дальнего сигнала, или я должен запустить таймер, когда я приеду близко?

Пожалуйста, как я могу исправить эту проблему?

Заранее за вашу помощь.

+0

Решение можно найти здесь. http://stackoverflow.com/questions/22627580/proximity-range-for-beacons-changes-back-and-forth-even-when-the-app-is-in-the-s/22628608? noredirect = 1 # comment45017403_22628608 Благодаря Paulw11. –

ответ

1

В одной из моих прошлых работ возникла необходимость в том же. Я надеюсь, что один из следующих поможет you.In мой случай моя логика была основана на RSSI (она также колеблется часто)

стороннюю 1 Поместите счетчик для CLProximityFar и CLProximityNear, и на основе этого триггера действие, Calculate число последовательных случаев того же Близость, если это так, то считать, что Близость и вызвать его действие.

Путь 2 Это полностью основано на значении RSSI. Для этого вам нужно использовать 10-20 постоянных значений RSSI, взять их Среднее и на основе этого Триггера действия.

+0

Спасибо за ответ, можете ли вы поделиться примером этого, пожалуйста? Прямо сейчас я использую решение Paulw11 с таймером. Когда он обнаруживает далеко, я запускаю таймер, и я проверяю, действительно ли я на самом деле, если на самом деле я меняю вид на устройстве. –

Смежные вопросы