开发过程中碰到一个问题:就是父类中要向外发送通知,然后子类中或者其他类中来接收它。当然一般是把它写到类方法中去,但是有个问题,就是如果调用的类不是它的子类,就不能直接调用,当然也可以采用静态方法实现,我这里主要是想用宏定义来实现,下面我分别介绍使用宏定义函数和定义代码块的方式进行,废话不多说了,直接上代码:
使用宏定义函数实现
//定义
#define SendNotification @"SendNotification"
#define sendMessage(msg) \
({\
dispatch_async(dispatch_get_main_queue(), ^{\
NSNotificationCenter* notificationCenter = [NSNotificationCenter defaultCenter];\
[notificationCenter postNotificationName:SendNotification object:nil userInfo:@{@"msg":msg}];\
});\
})
//使用
sendMessage(@"发个消息试试");
//有返回的宏函数定义
#define getSum(a,b) \
({\
(a+b);\
})
//使用
double sum = getSum(M_PI,M_E);
在宏定义中使用 block
//有返回的宏代码块定义
#define DYTestBlock(param1, block)\
NSLog(@"param1 : %@", (param1));\
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(9 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\
int blockParam1 = 1;\
NSString *blockParam2 = [NSString stringWithFormat:@"哈哈 : %@", param1];\
block(blockParam1, blockParam2);\
});\
2.调用这个宏定义(有一下两种方式调用)
// - 方式1
void(^block)(int, NSString *) = ^(int a, NSString *str) {
NSLog(@"%d, %@", a, str);
};
DYTestBlock(@"xx",block);
// - 方式 2
DYTestBlock(@"xx",^(int a, NSString *str) {
NSLog(@"%d, %@", a, str);
});
// - 方式三
DYBlock dyBlock ^(int a, NSString *str) {
NSLog(@"%d, %@", a, str);
};
DYTestBlock(@"xx",dyBlock);
网友评论