1

我正在使用AFNetworking'sAFHTTPClient类与 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动画方法在从动画块中调用时会以不同的方式表现,并且NSManangedObjectContext'sperformBlock:可能也在做类似的事情。

4

1 回答 1

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 ??];
}
于 2013-05-30T15:50:35.447 回答