【问题标题】:Detecting if a method is being called from a block检测是否从块中调用方法
【发布时间】:2013-05-30 15:20:27
【问题描述】:

我正在使用 AFNetworkingAFHTTPClient 类与 Rails 后端进行通信。

创建对象时,我想使用批处理 API 在服务器上运行多个 API 调用(我使用的是 batch_api,以防您想知道)。

为了很好地扩展 AFHTTPClient,我想有一个如下所示的 API:

[[[SPRRailsClient] sharedInstance] batchOperations:^ {
    NSMutableURLRequest *request = [[SPRRailsAPIClient sharedClient]
                  requestWithMethod:@"GET"                                                                                                       
                               path:myPath
                         parameters:parameters];
    AFHTTPRequestOperation *operation = [[SPRRailsAPIClient sharedClient]
                          HTTPRequestOperationWithRequest:request
                                                  success:nil
                                                  failure:nil];

}];

诀窍是覆盖SPRRailsClient(我的AFHTTPClient 子类),因此当requestWithMethod:path:parameters:HTTPRequestOperationWithMethod:success:failure:batchOperations 块内调用时,如果行为方式不同(排队或重新运行不同的AFOperation 的子类。

这种设计的巧妙之处在于它允许我保留现有代码并仅将其包装在块中,以便以“批处理模式”执行某些调用。

我的问题是:如何检测到正在从块中调用方法?我需要requestWithMethod:path:parameters: 来检测它,并且:

  1. 如果从 batchOperations 块调用,则以不同的方式运行。
  2. 如果没有从 batchOperations 块调用,只需调用 super

我知道向SPRRailsClient 添加两个额外的方法会更简单,但我认为这看起来更好。

另外,我认为这是可能的,因为 UIView 动画的某些方法在从动画块中调用时会以不同的方式表现,而 NSManangedObjectContextperformBlock: 可能也在做类似的事情。

【问题讨论】:

    标签: objective-c objective-c-blocks afnetworking


    【解决方案1】:

    我能想到的唯一方法是将 batchOpperations 块排入命名队列,然后在执行块时检查队列名称。这看起来像:

    在您的 .m 文件的顶部,或在您的方法中,都可以。

    static dispatch_queue_t myQueue;
    

    然后在batchOperations中,

    if (!myQueue){
     myQueue = dispatch_queue_create("com.mydomain.myapp.myqueue", NULL);
    }
    
    dispatch_async(myQueue, batchOpperation);
    

    然后在调用 sharedClient 方法时,检查队列:

    if ([[NSString stringWithCString:dispatch_queue_get_label(dispatch_get_current_queue()) encoding:NSUTF8StringEncoding] isEqualToString:@"com..."]){
        something....
    } 
    else{
        [super ??];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多