2013-05-30 2 views
1

AFNetworkingAFHTTPClient 클래스를 사용하여 Rails 백엔드와 통신합니다.블록에서 메소드가 호출되는지 감지

개체를 만들 때 배치 API를 사용하여 서버에서 여러 API 호출을 실행하고 싶습니다. 궁금한 점을 대비하여 batch_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]; 

}]; 

비결은 requestWithMethod:path:parameters:HTTPRequestOperationWithMethod:success:failure:batchOperations 내에서 호출 할 때 너무 SPRRailsClient (내 AFHTTPClient 서브 클래스)를 오버라이드 (override)하는 것 블록하는 경우 다른 방법으로 동작하는 경우 (대기열에 추가하거나 AFOperation의 다른 하위 클래스를 다시 실행합니다.)

이 디자인의 깔끔한 점은 기존 코드를 유지하면서 재치 만 감내 할 수 있다는 것입니다. 일부 호출이 "일괄 처리 모드"에서 실행될 수 있도록 블록에 입력하십시오.

제 질문은 : 블록에서 메소드가 호출되고 있음을 어떻게 감지합니까? 나는 그것을 감지 requestWithMethod:path:parameters: 필요하고, :

batchOperations 블록에서 호출하면
  1. 는 다른 방식으로 동작합니다.
  2. batchOperations 블록에서 전화하지 않은 경우 super으로 전화하십시오.

두 가지 추가 방법을 SPRRailsClient에 추가하는 것이 더 간단 할 것이라고 생각하지만,이 방법이 더 좋게 보입니다.

또한, 나는 UIView 애니메이션의 몇 가지 방법은 애니메이션 블록 내에서 호출 다른 방식으로 행동하기 때문에 그것이 가능 파악하고, NSManangedObjectContextperformBlock: 아마뿐만 아니라 비슷한 일을하고있다.

답변

1

내가 생각할 수있는 유일한 방법은 명명 된 큐에 batchOperations 블록을 큐에 넣은 다음 블록을 실행할 때 큐 이름을 확인하는 것입니다. 이 모양은 다음과 같습니다.

.m 파일 맨 위 또는 방법 중 하나에서 작동합니다.

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

좋은 생각 : 당신의 sharedClient 방법이 호출 될 때 내에서 다음

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

batchOpperations 내에서 다음
static dispatch_queue_t myQueue; 

,

는 큐를 확인! 내가하려고하는 것은 과잉 행동이다. – pgb

관련 문제