didRangeBeacons委托调用CLProximityNear和CLProximityFar太快了

时间:2015-02-05 02:24:24

标签: ios objective-c timer location ibeacon

我想插入一个计时器,以避免在"远","附近","立即"之间进行更改。状态。

我使用相同的视图"远"和"附近"国家,但我推动一个新的观点立即国家。

因此,对于返回root的直接情况,我通过这样做找到了解决方案:

[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];
    }
}

这是我想使用计时器(近)的方法。

-(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秒的计时器。方法。我想在回到之前至少停留20秒"远"。

我应该在哪里插入此计时器?我应该等待远信号,启动定时器并等待另一个远信号,或者当我到达附近时应该启动定时器吗?

请问我该如何解决这个问题?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在我过去的一项工作中,需要同样的事情。我希望以下之一能帮助你。在我的情况下,我的逻辑基于RSSI(它也经常波动)

方式1 为CLProximityFar和CLProximityNear放置一个计数器,并根据该触发操作,计算相同Proximity的连续出现次数,如果是,则考虑PROximity并触发其动作。

方式2 这完全基于RSSI值。为此,您需要使用10-20个连续RSSI值,取其平均值并根据触发操作。