如何在Objective C中存储块?

皮拉特

我开始在目标C中编写一个简单的JSON RPC TCP库。我有一个调用RPC方法的方法:

- (void)invokeMethod:(NSString *)method
      withParameters:(id)parameters
           requestId:(id)requestId
             success:(void (^)(id responseObject))success
             failure:(void (^)(NSError *error))failure
{
    NSAssert(NSClassFromString(@"NSJSONSerialization"), @"NSJSONSerialization not found!");
    NSDictionary *requestObject = @{@"jsonrpc": @"2.0",
                                    @"method": method,
                                    @"params": parameters,
                                    @"id": requestId};
    NSError *error = nil;
    NSData *jsondData = [NSJSONSerialization dataWithJSONObject:requestObject options:0 error:&error];
    if (error){
        return failure(error);
    }
    [self->callbacks setObject:@{@"success": success ? [success copy] : [NSNull null],
                                 @"failure": failure ? [failure copy] : [NSNull null]}
                        forKey:requestId];
    NSString *str = [[NSString alloc] initWithData:jsondData encoding:NSUTF8StringEncoding];
    NSLog(@"Sending: %@", str);
    [self.socket writeData:jsondData withTimeout:-1 tag:1];
}

该类基本上表示一个TCP连接,当调用上述方法时,JSON数据将以id的形式通过TCP发送到服务器,该服务器将返回成功或失败:

- (void) socket:(GCDAsyncSocket *)sender didReadData:(NSData *)data withTag:(long)tag
{
    NSError *error = nil;
    [self.socket readDataWithTimeout:-1 tag:2];
    // … rpc response parsing code here, removed for simplicity …
    // detect if error or success
    NSDictionary *cbs = [self->callbacks objectForKey:JSONRPCObjectId];
    void(^success)(id resultObject) = [cbs objectForKey:@"success"];
    success ? success(JSONRPCObjectResult) : nil;
    return;
}

现在,我不确定如何跟踪successandfailure块,当前我将它们NSMutableDict使用requestId作为键存储在中这样做是否合适,还是应该使用更好的方法?

内森·戴

Objective-C中的块是对象,您可以像对待其他对象一样对待它们,因此将它们存储在NSDictionarys,NSArrays等中非常好。唯一的问题是,最初创建的块与局部变量在同一个内存范围内,因此,当返回定义该块的方法时,它们就不再有效,就像所有其他局部变量一样,因此您必须先复制它们,只需复制它们,然后将副本放入集合中即可。有块复制功能,但是您可以向他们发送一条复制消息[myBlock copy];

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Swift Closure中获取Objective-C块输入参数

来自分类Dev

如何在Swift Closure中获取Objective-C块输入参数

来自分类Dev

如何在 Objective-C 中使用存储属性

来自分类Dev

如何在iOS / Objective-C中存储身份验证密钥?

来自分类Dev

如何在 Objective C 中使用 CallKit

来自分类Dev

如何在字符串变量中存储HTML块?

来自分类Dev

如何在Objective-C中将块内的变量分配给块外的变量

来自分类Dev

如何在Objective-C中将块内的变量分配给块外的变量

来自分类Dev

HDFS块中的数据如何存储?

来自分类Dev

HDFS块中的数据如何存储?

来自分类Dev

如何在Objective c 中处理TableviewCell 中的UIButton?

来自分类Dev

如何在Objective-C函数中返回C ++指针

来自分类Dev

如何在Objective-C中验证JSON模式?

来自分类Dev

如何在Objective-C中创建Swift对象?

来自分类Dev

如何在Swift / Objective C中从HTTP请求返回数据

来自分类Dev

如何在Swift中调用Objective C类方法

来自分类Dev

如何在Objective-C中列出可用的蓝牙设备?

来自分类Dev

如何在Objective-C中创建对象?

来自分类Dev

如何在Swift中调用Objective-C类别方法

来自分类Dev

如何在Objective-C中取消异步HTTP请求?

来自分类Dev

如何在Objective-C中定义API网址

来自分类Dev

如何在Realm中实现继承(iOS,Objective C)

来自分类Dev

如何在Swift中调用Objective-C instancetype方法?

来自分类Dev

如何在Objective-C中缓存图像

来自分类Dev

如何在Swift中从Objective-C访问NSMutableArray

来自分类Dev

如何在Objective-C中拦截AFNetworking请求的响应?

来自分类Dev

SwiftUI:如何在Objective-C中获取窗口

来自分类Dev

如何在Objective-C中创建简单加法?

来自分类Dev

如何在Objective c中从Web视图显示弹出窗口

Related 相关文章

  1. 1

    如何在Swift Closure中获取Objective-C块输入参数

  2. 2

    如何在Swift Closure中获取Objective-C块输入参数

  3. 3

    如何在 Objective-C 中使用存储属性

  4. 4

    如何在iOS / Objective-C中存储身份验证密钥?

  5. 5

    如何在 Objective C 中使用 CallKit

  6. 6

    如何在字符串变量中存储HTML块?

  7. 7

    如何在Objective-C中将块内的变量分配给块外的变量

  8. 8

    如何在Objective-C中将块内的变量分配给块外的变量

  9. 9

    HDFS块中的数据如何存储?

  10. 10

    HDFS块中的数据如何存储?

  11. 11

    如何在Objective c 中处理TableviewCell 中的UIButton?

  12. 12

    如何在Objective-C函数中返回C ++指针

  13. 13

    如何在Objective-C中验证JSON模式?

  14. 14

    如何在Objective-C中创建Swift对象?

  15. 15

    如何在Swift / Objective C中从HTTP请求返回数据

  16. 16

    如何在Swift中调用Objective C类方法

  17. 17

    如何在Objective-C中列出可用的蓝牙设备?

  18. 18

    如何在Objective-C中创建对象?

  19. 19

    如何在Swift中调用Objective-C类别方法

  20. 20

    如何在Objective-C中取消异步HTTP请求?

  21. 21

    如何在Objective-C中定义API网址

  22. 22

    如何在Realm中实现继承(iOS,Objective C)

  23. 23

    如何在Swift中调用Objective-C instancetype方法?

  24. 24

    如何在Objective-C中缓存图像

  25. 25

    如何在Swift中从Objective-C访问NSMutableArray

  26. 26

    如何在Objective-C中拦截AFNetworking请求的响应?

  27. 27

    SwiftUI:如何在Objective-C中获取窗口

  28. 28

    如何在Objective-C中创建简单加法?

  29. 29

    如何在Objective c中从Web视图显示弹出窗口

热门标签

归档