-
Notifications
You must be signed in to change notification settings - Fork 2.2k
JPBlock 扩展使用文档
JSPatch 核心支持 block 调用,但使用上有几个限制:
A. block 参数个数最多支持6个。
B. block 参数类型不能是 double / NSBlock / struct 类型。
C. 不支持 JS 封装的 block 传到 OC 再传回 JS 去调用。(#155)
JPBlock 扩展解决了这些限制,只要接入 JPBlock 扩展,就可以:
A. block 参数支持任意多个。
B. block 参数类型可以是除 struct / union 以外的任意类型,包括 double。
C. 支持 JS 封装的 block 传到 OC 再传回 JS 去调用。
JPBlock 是在 libffi 的的帮助下根据参数类型去动态创建 block,所以需要依赖 libffi 库。目前还未发布到 cocoapods,可以手动接入:
把 Extensions/JPLibffi
和 Extensions/JPBlock
加入工程。
在 JS 调用 require('JPEngine').addExtensions(['JPBlock']);
即可使用。
// Obj-C
@implementation JPObject
+ (void)request:(void(^)(NSString *content, double num))callback
{
callback(@"I'm content", 4.2);
}
@end
require('JPEngine').addExtensions(['JPBlock']);
require('JPObject').request(
block("void, NSString *, double", function(ctn, num) {
if (succ) console.log(ctn, num) //output: I'm content, 4.2
})
)
接入 JPBlock 扩展后,block()
接口参数定义必须加上 block 返回值,例如上述例子中,对于 (void(^)(NSString *content, double num))
这个 block:
以前只需要写参数类型 block("NSString *, double", function(){})
。
使用 JPBlock 扩展后,需要把返回值类型加在最前面:block("void, NSString *, double", function(){})
。
未使用 JPBlock 扩展时仍可以不写返回值类型(写也可以),对已有代码不影响。