使用通知作为回调的问题?

时间:2015-02-07 00:56:31

标签: ios objective-c callback notifications bluetooth-lowenergy

我正在尝试在另一个类中发生某些事情时更新视图,并且经过一些查看后,看起来最常见的方法是使用委托或块来创建回调。但是,我能够使用通知完成此任务。我想知道的是:使用通知触发方法调用是否有问题?我不知道有什么风险吗?我是否有理由想要使用块/代理而不是通知?

我是Objective-C的新手,所以我不确定我采取的方法是否正确。

例如,我试图在ViewController上设置BLE设备的电池电量。我有一个BluetoothLEManager,它可以发现外围设备,它的服务/特性等。但要做到这一点,我需要启动"连接"在detailViewController中,一旦找到它就更新电池电量。

以下是我正在做的一些示例代码:

DetailViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];

    // Do any additional setup after loading the view.
    NSLog(@"Selected tag UUID: %@", [selectedTag.tagUUID UUIDString]);
    tagName.text = selectedTag.mtagName;
    if(selectedTag.batteryLevel != nil){
         batteryLife.text = selectedTag.batteryLevel;
    }

    uuidLabel.text = [selectedTag.tagUUID UUIDString];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setBatteryLevel:) name:@"SetBatteryLevel" object:nil];
}
...
-(void)setBatteryLevel:(NSNotification*)notif{
    NSMutableString* batLevel = [[NSMutableString alloc]initWithString:[NSString stringWithFormat:@"%@", selectedTag.batteryLevel]];
    [batLevel appendString:@" %"];
    selectedTag.batteryLevel = batLevel; 
    batteryLife.text = selectedTag.batteryLevel;
}

BluetoothLEManager.m:

...
-(void) getBatteryLevel:(CBCharacteristic *)characteristic error:(NSError *)error fetchTag:(FetchTag *)fetchTag
{
    NSLog(@"Getting battery Level...");
    NSData* data = characteristic.value;
    const uint8_t* reportData = [data bytes];
    uint16_t batteryLevel = reportData[0];
    selectedTag.batteryLevel = [NSString stringWithFormat:@"%i", batteryLevel];
    NSLog(@"Battery Level is %@", [NSString stringWithFormat:@"%i", batteryLevel]);
    [[NSNotificationCenter defaultCenter] postNotificationName:@"SetBatteryLevel" object:nil]; 


}
...

如果您需要任何其他代码,请告诉我,但这是所有内容的基础知识。

1 个答案:

答案 0 :(得分:2)

每种方法都有不同的优点和缺点。

委托和协议要求在对象与其委托之间建立一个定义的接口,一对一的关系,并且该对象具有它将要调用的委托对象的特定知识。 / p>

具有完成块的方法涉及对象与调用该方法的对象之间的类似的一对一关系。但是,由于块继承了它们定义的范围,因此您可以更加灵活地完成块中可用的上下文。块还允许调用者在调用发生的同一位置定义完成代码,使代码更加自我记录。

在这两种情况下,通知委托或调用完成块的对象必须知道它正在与谁通话,或者正在执行什么代码。

代表电话就像一个汽车商店,给你回电,让你知道你的汽车已经完成。服务经理必须拥有您的电话号码并知道您需要打电话。

块更像是你给厨师的食谱。给厨师一个不同的食谱,他/她为您执行不同的任务。

通知的耦合程度要低得多。它就像一个镇上的人,在拥挤的公共广场大喊大叫。犯罪分子不需要知道谁在听,或者有多少人在听。

同样,当您发送通知时,您不知道是谁,如果有人在听,或者有多少听众。你不需要知道。如果10个对象关心您正在播放的消息,他们都可以听取它,并且他们都会收到通知。邮件发件人不必知道或关心谁在听。

有时你想要更紧密的耦合,有时你想要更松散的耦合。这取决于你试图解决的问题。