如何在主视图控制器中创建一个用户定义的方法,以便在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
做了什么名字 - 它开始一系列的加速度计更新方法,并将它们传达给你的提名队列,在你的情况下这是一个任意的后台队列。
因此,每当操作系统在加速度计中发现变化时,都会执行当前将值存储到x
,y
和z
的代码。您可能会从陀螺仪和磁力仪获得类似的永久更新序列。
因此,这些信息流可能是更新的触发器。每次新的加速计,陀螺仪或磁力计更新到达时,都要更新您的知识。如果你为这三件事情中的每一件都创建一个单独的队列,那么很可能你最终会在不同的线程上为它们提供服务,所以你需要担心并发数据访问。或者你可以使用[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...];
,有人。