【发布时间】:2013-05-30 15:20:27
【问题描述】:
我正在使用 AFNetworking 的 AFHTTPClient 类与 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: 来检测它,并且:
- 如果从
batchOperations块调用,则以不同的方式运行。 - 如果没有从
batchOperations块调用,只需调用super。
我知道向SPRRailsClient 添加两个额外的方法会更简单,但我认为这看起来更好。
另外,我认为这是可能的,因为 UIView 动画的某些方法在从动画块中调用时会以不同的方式表现,而 NSManangedObjectContext 的 performBlock: 可能也在做类似的事情。
【问题讨论】:
标签: objective-c objective-c-blocks afnetworking