-1

我自己学习了目标c,没有参加任何课程。因此,有时我在编写 iOS 应用程序时会对一些小事感到困惑。这个问题可能很蹩脚,但我找不到任何解决方案,或者我无法理解解决方案。这是我的情况:

我的应用程序包含单个视图控制器(默认)。我想从加速度计、陀螺仪和磁力计获得连续值,并使用这些值使用行人航位推算 (PDR) 来估计用户位置。为此,我使用了 CoreMotion 并motionManager在头文件中创建了一个 CLMotionManager ( ) 属性。使用这个管理器,我可以检查传感器是否可用并获取它们的值,例如:

if([_motionManager isAccelerometerAvailable])
{
    _motionManager.accelerometerUpdateInterval = 0.1;
    [_motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc]init] withHandler:^(CMAccelerometerData * _Nullable accelerometerData, NSError * _Nullable error) {
            x=accelerometerData.acceleration.x;
            y = accelerometerData.acceleration.y;
            z = accelerometerData.acceleration.z;

    }];}

同样,我可以从陀螺仪和磁力计中获取值。IBAction按下按钮后,我在方法中获取这些值:

-(IBAction)startSensor:(id)sender
{
//Getting accelerometer, gyroscope, and magnetometer values.
}

PDR 操作发生在我的下一个方法中:

-(void)thePDROperationWith:(NSArray*)accelerometerValues gyroscopeValues:(NSArray*)gyros magnetometerValues:(NSArray*)magneto
{
//The PDR operations with accelerometer, gyroscope and magnetometer values
}

现在,我的问题是:

1)如何从thePDROperationWith:: 方法中获得连续的PDR操作值?我在方法内部调用了这个startSensor方法,但是当我按下按钮时我只得到一次值。此外,我是否也应该在头文件中声明此方法(如在用户定义的NSObject子类中)?

2)用户定义的方法和委托方法有什么区别,比如

//a method in CLBeaconManager delegate -(void)beaconManager:(CLBeaconManager*)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { //code }?

这个委托方法(我希望我使用的是正确的术语)连续运行以在定义的CLBeaconRegion. 我怎样才能为我的目的制作这种方法?

谢谢你。

4

1 回答 1

1

startAccelerometerUpdatesToQueue顾名思义——它开始一系列加速度计更新方法,并在指定队列上将它们传达给您,在您的情况下,它是一个任意后台队列。

因此,您当前将值存储到的代码x将在每次操作系统发现加速度计发生变化时执行。您可能已经从陀螺仪和磁力计中获得了类似的永久更新序列。yz

因此,这些信息流可以成为您更新的触发器。每次有新的加速度计、陀螺仪或磁力计更新时,更新您的知识。

(不过,警告一下:如果你为这三件事中的每一个都创建了一个单独的队列,那么你很可能最终会在不同的线程上为它们提供服务。所以你需要担心并发数据访问。或者你可以改为用于[NSOperationQueue mainQueue]在同一个队列上接收所有更新,如果您只是希望操作系统为您序列化所有内容,这也是 UIKit 操作的队列)。

委托方法是一种代表一个类委托给另一个类的函数的方法。在这种情况下,信标管理器知道如何跟踪信标,但不知道在此应用程序中作为跟踪信标的结果应该做什么。因此,它委托来自信标更改的决策。

Objective-C 让你对这些事情非常松散,所以如果查看旧代码,你可能会看到一些非常非正式的方法,但现在通常的方法是声明一个委托协议,例如:

@class MyClass; // Declare that there is a class called MyClass.

// Define a protocol for delegates.
@protocol MyProtocol
- (void)thisClass:(MyClass *)class learntFact:(Fact *)fact;
@end

// Here's MyClass for real
@interface MyClass
@property(nonatomic, weak) id<MyProtocol> factDelegate;
@end

然后,当一个实例MyClass有话要说时,它只会告诉委托:

[self.factDelegate thisClass:self learntFact:...fact here...];

并且想要成为代表的人instanceOfMyClass.factDelegate = self已经宣布支持相关协议。

于 2017-09-25T13:28:05.813 回答