如何在 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 发现加速度计发生变化时,将执行当前将值存储到 x
、y
和 z
的代码。您可能已经从陀螺仪和磁力计获得了类似的永久更新序列。
所以这些信息流可以成为您更新的触发器。每次新的加速度计、陀螺仪或磁力计更新到来时,更新您的知识。
(虽然快速警告:如果您为这三件事中的每一个创建一个单独的队列,那么您最终可能会在不同的线程上为它们提供服务。因此您需要担心并发数据访问. 或者你可以使用 [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
,宣布支持相关协议。
我自学 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 发现加速度计发生变化时,将执行当前将值存储到 x
、y
和 z
的代码。您可能已经从陀螺仪和磁力计获得了类似的永久更新序列。
所以这些信息流可以成为您更新的触发器。每次新的加速度计、陀螺仪或磁力计更新到来时,更新您的知识。
(虽然快速警告:如果您为这三件事中的每一个创建一个单独的队列,那么您最终可能会在不同的线程上为它们提供服务。因此您需要担心并发数据访问. 或者你可以使用 [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
,宣布支持相关协议。