【问题标题】:How to use performSelector on block [closed]如何在块上使用 performSelector [关闭]
【发布时间】:2013-04-14 02:44:18
【问题描述】:

下面是代码:

if ([motionManager isAccelerometerAvailable] == YES) {
    motionManager.deviceMotionUpdateInterval = 1.0 / 100.0;
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    [motionManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
                    [self performSelector:@selector(exchangeCard)
                               withObject:nil
                               afterDelay:0];

    }];

我发现没有在块上调用选择器。所以我的问题是如何让 performSelector 在块上调用函数

【问题讨论】:

  • 你为什么使用performSelector而不是仅仅调用方法?
  • 你是什么意思“被召唤”? exhangeCard 被调用了吗? performSelector: 被调用了吗? - 你知道除非你了解线程,否则你不应该真正使用startAccelerometerUpdatesToQueue
  • 上面的代码看起来不错。您确定该块正在执行吗?
  • 正如@MarceloFabri 所说,您为什么不直接在街区内致电[self exchangeCard]

标签: ios block performselector


【解决方案1】:

通常不需要使用startAccelerometerUpdatesToQueue:,除非你知道你在用线程做什么,否则你当然不应该使用它。在我看来你不像!使用运动管理器的方法是启动它,然后重复询问它的更新(您可以使用重复的 NSTimer 进行设置)。

self.motman = [CMMotionManager new];
if (!self.motman.accelerometerAvailable) {
    NSLog(@"oh well");
    return;
}
self.motman.accelerometerUpdateInterval = // whatever
[self.motman startAccelerometerUpdates];
NSTimeInterval t = self.motman.accelerometerUpdateInterval * 10;
self.timer =
    [NSTimer
        scheduledTimerWithTimeInterval:t
        target:self selector:@selector(poll:) userInfo:nil repeats:YES];

所以现在poll:会被重复调用,你可以为所欲为:

- (void) poll: (id) dummy {
    // ask self.motman for current values here; for example:
    CMAccelerometerData* dat = self.motman.accelerometerData;
    // now do something with that info
}

有关如何使用运动管理器获取加速度值的实际代码和完整说明,请参阅我的书:http://www.apeth.com/iOSBook/ch35.html#_raw_acceleration

【讨论】:

  • deviceMotionUpdateInterval 不是“随便” - the effective resolution of the time interval for a timer is limited to on the order of 50-100 milliseconds
  • 不,@AndreiG.,阅读文档。更新间隔是一回事;计时器是另一个。这是进行投票的另一个很好的理由。运动管理器将在 间隔保持最新;您只需需要的频率获取信息。
  • 同意,只是您的代码使用accelerometerUpdateInterval 设置NSTimer 延迟(例如:如果我将accelerometerUpdateInterval 设置为0.01 - NSTimer 将在其推荐的频率范围之外运行),IMO最好使这两者相互独立,并将NSTimer 延迟硬编码为您需要轮询的频率。除此之外,一切都很美好,干杯:)
  • 我的计时器比运动管理器更新间隔慢十倍,无论如何,OP 当然可以使用任何适合的值。
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 2011-07-18
  • 2018-10-30
  • 2013-05-16
  • 1970-01-01
相关资源
最近更新 更多