如何在 main viewcontroller 中创建一个用户定义的方法,在 iOS 中连续更新值?

How to make a user defined method in main viewcontroller that updates values continuously in iOS?

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

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

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 中对信标进行测距。我怎样才能为我的目的制作这样的方法?

谢谢。

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

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

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

(虽然快速警告:如果您为这三件事中的每一个创建一个单独的队列,那么您最终可能会在不同的线程上为它们提供服务。因此您需要担心并发数据访问. 或者你可以使用 [NSOperationQueue mainQueue] 让所有的更新都在同一个队列上接收,这也是 UIKit 操作的队列,如果你只是想让 OS 为你序列化所有的东西)。

委托方法是表示一个 class 委托给另一个函数的方法。在这种情况下,信标管理器知道如何跟踪信标,但不知道根据跟踪的信标在该应用程序中做什么是合适的。因此,它委托了信标更改产生的决策。

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,宣布支持相关协议。