Pdef 1.2.0

Pdef 1.2.0

测试已测试
Lang语言 Obj-CObjective C
许可证 自定义
发布最后发布2014年12月

未声明 维护。



Pdef 1.2.0

  • Ivan Korobkov

Pdef Objective-C

Pdef 编译器 以及 Objective-C 描述符实现、JSON 格式和 HTTP RPC 的 Objective-C 代码生成器。

要求

  • Objective-C: iOS 6.0, Mac OSX 10.8, AFNetworking 2.0。
  • 代码生成器: Pdef 编译器 1.2+, Python 2.6 或 Python 3.3+。

安装

  • 代码生成器:将代码生成器作为 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

信息

生成的信息实现了 isEqualhash 方法,NSCopyingNSCoding 协议,并支持合并。`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 格式

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];

HTTP RPC 客户端

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);
        }
    }
}];

在需要自定义头时,用自定义的 NSURLSessionAFURLSessionManager 初始化 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

除非法律规定或书面同意,否则在本许可证下分发的软件系以“现状”为基础分发,不提供任何形式的明示或默示保证。有关许可证下权限和限制的具体语言,请参阅许可证。