如何在主视图控制器中创建一个用户定义的方法,以便在iOS中连续更新值?

问题描述:

我学习了自己的目标c,并没有采取任何课程。因此,在编写iOS应用程序时,有时候我会对小事感到困惑。这个问题可能非常蹩脚,但我找不到任何解决方案,或者我无法理解解决方案。这是我的情况:如何在主视图控制器中创建一个用户定义的方法,以便在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方法中调用了此方法,但是当我按下按钮时,I 仅获取一次该值。此外,我是否应该在头文件中声明这个方法 (如用户定义的NSObject子类)?

2)是什么样

//a method in CLBeaconManager delegate -(void)beaconManager:(CLBeaconManager*)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region { //code }用户定义的方法和委托方法之间的差异?

此委托方法(我期望我使用正确的术语)连续运行以定义CLBeaconRegion中的信标范围。我如何为我的目的制作这种方法?

谢谢。

startAccelerometerUpdatesToQueue做了什么名字 - 它开始一系列的加速度计更新方法,并将它们传达给你的提名队列,在你的情况下这是一个任意的后台队列。

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

因此,这些信息流可能是更新的触发器。每次新的加速计,陀螺仪或磁力计更新到达时,都要更新您的知识。如果你为这三件事情中的每一件都创建一个单独的队列,那么很可能你最终会在不同的线程上为它们提供服务,所以你需要担心并发数据访问。或者你可以使用[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实例有话要说,它只是告诉代表:想要成为一个代表组instanceOfMyClass.factDelegate = self,具有相关的协议宣布支持

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

,有人。