我对iOS开发非常陌生,并且一直在尝试解决以下问题:
我有一个ViewController
,它显示随时间变化的信息。我还有另一个控制器(TimeController
)管理时间。 TimeController
每秒钟触发一次NSTimer
,以检查我是否输入了新的时隙(后面有一些逻辑,以及是否输入了新的时隙,这意味着ViewController
中的信息需要要被更新。
以我的理解,我需要某种回调过程,但我不知道该怎么做-我阅读了有关块的信息,但老实说,它们非常压倒性的,并且我无法将问题与所看到的示例联系起来。TimeController
看起来类似于以下内容:
// TimeController.h
@interface TimeController : NSObject
@property (weak) NSTimer *periodicTimer;
@property NSInteger timeslot;
@end
// TimeController.m
#import "TimeController.h"
@implementation TimeController
-(void)startTimer {
self.periodicTimer = [NSTimer scheduledTimerWithTimeInterval:(1) target:self
selector:@selector(onTimer) userInfo:nil repeats:YES];
}
-(void)onTimer {
// check if anything has changed.
// If so, change timeslot. Notify "listening" objects.
}
在一个简单的示例中,单个示例取决于
ViewController
,而我想像的是:// ViewController.h
@interface ViewController : UIViewController
@property TimeController* timeCtrl;
@end
// ViewController.m
#import "ViewController.h"
#import "TimeController.h"
-(void)onNotificationFromTimeController {
// timeslot has changed in the TimeController.
NSInteger tslot = timeCtrl.timeslot;
// figure out new display value depending on tslot. Update the view
}
回调机制是这里缺少的(除了诸如
TimeController
的正确初始化之类的其他东西)。我将不胜感激! 最佳答案
通知事项
在ViewController
中将侦听器添加到事件(将其称为“ TimeNotificationEvent”):
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onNotificationFromTimeController) name:@"TimeNotificationEvent" object:nil];
在
onTimer
中的TimeController.m
方法中,添加以下代码以发布通知:[[NSNotificationCenter defaultCenter] postNotificationName:@"TimeNotificationEvent" object:nil];
旁注:要停止收听通知,请执行以下操作:
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"TimeNotificationEvent" object:nil];
易于设置
同一事件可以有多个侦听器
积木
在
TimeController.h
中添加属性:@property (nonatomic, copy) dispatch_block_t timerBlock;
在
TimeController.m
中添加对timerBlock的调用:-(void)onTimer {
// Check for nil to avoid crash
if (_timerBlock) {
_timerBlock();
}
}
在
ViewController
中分配块:_timeCtrl.timerBlock = ^{
// Do stuff to the UI here
};
稍微复杂一点(保留周期,语法等)
仅一个侦听器(使用此特定示例实现)
更容易遵循代码
关于ios - 需要 objective-c 重复回调,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25386677/