다른 클래스에서 무언가가 일어 났을 때 뷰를 업데이트하려고하고 있는데,보기가 끝나면 델리게이트 또는 블록을 사용하여 콜백을 만드는 것이 가장 일반적인 방법 인 것으로 나타났습니다. 그러나 알림을 사용하여이 작업을 수행 할 수있었습니다. 내가 알고 싶은 것은 : 메소드 호출을 트리거하기 위해 알림을 사용하는 데 문제가 있습니까? 내가 모르는 어떤 위험이 있습니까? 알림을 통해 차단/위임을 사용하려는 이유가 있습니까?알림을 콜백으로 사용하는 데 문제가 있습니까?
저는 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];
}
...
는 다른 코드가 필요 알려줘 , 그러나 이것 모두의 기본입니다.
블록/위임자 대신 NSNotification의 문제는 NSNotification이 전역이라는 것입니다. 누가 듣고 있는지, 그리고 수신자가 여전히 기억에 있는지 잘 모를 것입니다. 일단 NSNotification을 발송하면 그것이 받았는지 전혀 알 수 없습니다. 블록/델리게이트를 사용하면, 누가 당신에게 그것을 보내고 대리인에 대한'selector'를 호출하는지 정확히 알 수 있습니다. NSNotifications는 글로벌 일에 더 많이 사용되지만 대상을 원하는 경우 대리인/차단만큼 깨끗하지는 않습니다. – LyricalPanda
코코아 (코코아 터치)의 가장 훌륭하고 강력한 기능 중 하나 인 핵심 가치 관찰 (KVO)에 대해 알아야 할 세 번째 방법이 있습니다. – Jef