检测是否正在从块调用方法

时间:2013-05-30 15:20:28

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

我正在使用AFNetworking的{​​{1}}类与Rails后端进行通信。

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

很好地扩展API我正在考虑使用这样的API:

AFHTTPClient

诀窍是覆盖[[[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来检测它,并且:

  1. 如果从requestWithMethod:path:parameters:块调用,则表现方式不同。
  2. 如果未从batchOperations块调用,请致电batchOperations
  3. 我知道向super添加另外两种方法会更简单,但我认为这看起来更好。

    另外,我认为这是可能的,因为SPRRailsClient动画的一些方法在从动画块中调用时以不同的方式运行,而UIView的{​​{1}}可能正在做某事类似的。

1 个答案:

答案 0 :(得分:1)

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

在.m文件的顶部或您的方法中,可以正常工作。

static dispatch_queue_t myQueue;

然后在batchOpperations中,

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