为 Pdef 编译器 以及 Objective-C 描述符实现、JSON 格式和 HTTP RPC 的 Objective-C 代码生成器。
代码生成器:将代码生成器作为 python 包安装
$ pip install pdef-objc
或 下载 发布版本,解压并在 generator
目录中运行
$ python setup.py install
Objective-C 包通过 CocoaPods
pod "Pdef"
传递 pdef 包路径或 URL 给编译器
$ pdefc generate-objc https://raw.github.com/pdef/pdef/1.2/example/world.yaml \
--out Generated
使用 --prefix
参数将命名空间映射到类前缀
$ pdefc generate-objc https://raw.github.com/pdef/pdef/1.2/example/world.yaml \
--prefix world.space:SP
--prefix world:WL
--out Generated
生成的信息实现了 isEqual
、hash
方法,NSCopying
和 NSCoding
协议,并支持合并。`copyWithZone` 方法返回信息深拷贝。信息不是线程安全的。示例基于 pdef 例包。
Human *human = [[Human alloc]init];
human.id = 1;
human.name = @"John";
human.sex = Sex_MALE;
human.continent = ContinentName_EUROPE;
Human *copy = [human copy];
assert([human isEqual:copy]);
信息支持合并,可以从源信息深拷贝字段到目标信息
Human *human = [[Human alloc]init];
human.id = 1;
human.name = @"John";
human.sex = Sex_MALE;
human.continent = ContinentName_EUROPE;
Human *another [[Human alloc]init];
[another merge:human];
assert([another isEqual:human]);
信息使用未包类型的原语和 bool 标志来指示字段是否设置或为空。
// Primitive fields return default values, has{FieldName} returns NO.
Human *human = [[Human alloc]init];
assert(human.id == 0);
assert([human hasId] == NO);
// When a field is set has{FieldName} returns YES.
human.id = 123;
assert([human hasId] == YES);
// Execute a special clear method to clear a field.
[human clearId];
JSON 序列化基于 NSJSONSerialization
,并增加了将原语和 bool 标志序列化/反序列化为根 JSON 对象(不仅仅是对象和数组)的支持。
// To a JSON-compatible dictionary.
NSDictionary *dict = [human toDictionary];
// To JSON data.
NSError *error = nil;
NSData *data = [human toJsonError:&error];
解析
// From a JSON-compatible dictionary, supports polymorphic messages.
NSDictionary *dict = getJsonDictionary();
Human *human = [Human messageWithDictionary:dict];
// From JSON data, supports polymorphic messages.
Human *human1 = [Human messageWithData:data error:&error];
使用用户 PDJsonFormat
读取/写入其他 pdef 数据类型
// Serialize a list of ints.
PDDataTypeDescriptor *listd = [PDDescriptors listWithElement:[PDDescriptors int32]];
NSArray *array = @[@1, @2, @3];
NSError *error = nil;
NSString *json = [PDJsonFormat writeString:array descriptor:listd error:&error];
// Parse a list of ints.
NSArray *parsed = [PDJsonFormat readString:array descriptor:listd error:&error];
RPC 客户端基于 AFNetworking,实现是线程安全的。
// Create an RPC client as an invocation handler.
PDRpcClient *handler = [[PDRpcClient alloc]
initWithDescriptor:WorldDescriptor()
baseUrl:@"http://example.com/world"];
// Create a generated protocol client and pass the handler to it.
World *world = [[WorldClient alloc] initWithHandler:client];
// Execute a void remote method.
[world switchDayNightCallback:^(id result, NSError *error) {
NSLog(@"Switched the light");
}];
// Execute a remote method with result.
[[world humans] allLimit:10 offset:0 callback:^(id result, NSError *error) {
if (error) {
NSLog(@"%@", error.localizedDescription);
} else {
NSArray *humans = result;
for (Human *h in humans) {
NSLog(@"%@", h.name);
}
}
}];
在需要自定义头时,用自定义的 NSURLSession
或 AFURLSessionManager
初始化 PDRpcClient
,或从它扩展。
远程应用程序错误以 NSErrors
传递,域为 PDefErrorDomain
,代码为 PDRpcException
,异常消息放在用户字典中的 PDRpcExceptionKey
键下。
// Get a remote exception.
[[world humans] allLimit:10 offset:0 callback:^(id result, NSError *error) {
if ([error.domain isEqualToString:PDefErrorDomain] && error.code == PDRpcException) {
PDMessage *exception = [error.userInfo objectForKey:PDRpcExceptionKey];
}
}];
// Or a simplified version.
[[world humans] allLimit:10 offset:0 callback:^(id result, NSError *error) {
if (PDIsRpcError(error)) {
PDMessage *exception = PDGetRpcException(error);
}
}];
Objective-C 没有服务器实现。
版权:2013 Ivan Korobkov [email protected]
本作品遵循Apache许可证2.0版(以下简称“许可证”);除非符合许可证要求,否则不得使用本文件。您可以在以下链接获取许可证副本:
http://www.apache.org/licenses/LICENSE-2.0
除非法律规定或书面同意,否则在本许可证下分发的软件系以“现状”为基础分发,不提供任何形式的明示或默示保证。有关许可证下权限和限制的具体语言,请参阅许可证。