我对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/

10-09 04:00