JPBlock 扩展使用文档

bang edited this page Mar 29, 2017 · 6 revisions

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/JPLibffiExtensions/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 扩展时仍可以不写返回值类型(写也可以),对已有代码不影响。