如何在Objective-C中找到平均10个信号强度记录

时间:2014-08-11 15:43:30

标签: ios objective-c core-location cllocationmanager core-telephony

我试图找到平均10个信号强度值(以提高使用CTGetSignalStrength时的准确度)。我也试图捕获用户位置(一次)。我目前有以下代码,虽然我发现这不起作用。我如何安排if语句以确保记录10个信号强度值的平均值,同时仅在buttonPressed时记录一个位置?

- (IBAction)buttonPressed:(id)sender {

    dispatch_async(backgroundQueue, ^{
        manager.delegate = self;
        manager.desiredAccuracy = kCLLocationAccuracyBest;
        [manager startUpdatingLocation];
    });

}

#pragma mark CLLocationManagerDelegate Methods

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    NSLog(@"Error: %@", error);
    NSLog(@"Failed to get location!");
}

- (void)arrayBuild {
    loopCount++;
    if (loopCount >= 11) {
        [myTimer invalidate];
        myTimer = nil;
        [manager startUpdatingLocation];

    } else {

    }

}

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {


        NSLog(@"Location: %@",newLocation);
        CLLocation *curentLocation = newLocation;

        if (curentLocation != nil) {

        float signalstrength = CTGetSignalStrength();

        NSMutableArray *resultsArray = [[NSMutableArray alloc]init];
        NSNumber *avg = [resultsArray valueForKeyPath:@"@avg.self"];
        NSString *result = [NSString stringWithFormat:@"%f", signalstrength];
        NSInteger resultInt = [result integerValue];
        [resultsArray addObject:[NSNumber numberWithFloat:resultInt]];

        self.latitude.text = [NSString stringWithFormat:@"%.8f",curentLocation.coordinate.latitude];
        self.longitude.text = [NSString stringWithFormat:@"%.8f",curentLocation.coordinate.longitude];
        self.signal.text = [NSString stringWithFormat:@"%.8f",signalstrength];


        // Code below uses a third party utility to submit data

        PFObject *Object = [PFObject objectWithClassName:@"Issue"];

        Object[@"Latitude"] = [NSString stringWithFormat:@"%.8f",curentLocation.coordinate.latitude];
        Object[@"Longitude"] = [NSString stringWithFormat:@"%.8f",curentLocation.coordinate.longitude];
        Object[@"Signal"] = [NSString stringWithFormat:@"%@",avg];

        myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                                                   target:self
                                                 selector:@selector(arrayBuild)
                                                 userInfo:nil
                                                  repeats:YES];
        [Object saveInBackground];
    }
}

1 个答案:

答案 0 :(得分:1)

我会做什么:

1)使用区域而不是一组坐标。要么计算出传递数据要么不太优雅......为区域设置一个全局变量。

注册接收"区域更新"通过

startMonitoringForRegion:

然后使用委托调用您的"区域更新"每次用户移动时更改全局变量的方法。

2)委托方法

-(void)locationManager: didUpdateToLocation: fromLocation:

...在iOS 6.0中已弃用 您应该为...设置委托

- (void)locationManager: didUpdateLocations:

...然后致电

[CLLocationManager startUpdatingLocation];

您将立即调用您的委托方法。

Xcode中的文档说:

  

具体来说,它会考虑desiredAccuracy和distanceFilter属性中的值来确定何时传递新事件。导航应用程序或需要高精度位置数据或常规更新流的任何应用程序都需要标准位置服务的精确度。

[RANT]

(也许是你的意图,但我们在这里混合了两种不同的方案 - 标准位置委托处理程序加上用CTGetSignalStrength进行轮询......可能想要切出一个或另一个)

[/ RANT]

...所以我认为你必须等待位置数据不断更新(即信号强度),一旦你告诉超类你想要最好的位置调整程度。< / p>

3)无法在CTGetSignalStrength上找到很多定义信息,但我认为它返回一个int,而不是一个浮点数。平均时要记住的一点是,你要将-decibels作为一个整体。由于它是logerithmic,你必须转换为十进制,即:

-65db, -40db, -75db 

可以......

10^(-65/10.), 10^(-40/10.), 10^(-75/10.)

在权力范围内。然后平均这些值并转换回db。请仔细检查您在确切的模块/标题中从CTGetSignalStrength获取的单位。希望有所帮助。