2014-04-28 2 views
1

RestKit에서 해결되지 않은 원격 요청으로 인해 다른 요청이 대기열에 올라가고 이전 요청이 완료 될 때까지 차단되는 문제가 있습니다. 나는 RestKit 기본값 인 AFNetworking의 setMaxConcurrentOperationCount 값을 5로 읽었지만 하나의 해결되지 않은 요청으로 차단이 발생했습니다.RestKit - 이전 호출이 완료 될 때까지 블록 요청

RestKit의 현재 버전에서도 기본값이 5로 설정되어 있습니까? 그렇다면 동시 요청 수가 부족할 수있는 원인은 무엇입니까?

RestKit 0.20.3

요청

- (RKManagedObjectRequestOperation*) getUser { 
    RKObjectManager *objectManager = [RKObjectManager sharedManager]; 
    NSDictionary *items = [objectManager.HTTPClient defaultHeaders]; 
    NSString *auth = [items objectForKey:@"Authorization"]; 

    if (auth == nil) { 
     NSLog(@"You must login first\n"); 
     return nil; 
    } 

    auth = [auth stringByReplacingOccurrencesOfString:@"Bearer " withString:@""]; 

    NSMutableString *path = [NSMutableString stringWithFormat:@"/users?accessToken=%@", auth]; 
    return [[RKObjectManager sharedManager] appropriateObjectRequestOperationWithObject:nil method:RKRequestMethodGET path:path parameters:nil]; 
} 

- (void) getUser:(void (^) (RKObjectRequestOperation *operation , RKMappingResult *mappingResult))success failure:(void (^) (RKObjectRequestOperation *operation , NSError *error))failure { 
    RKManagedObjectRequestOperation *requestOperation = [self getUser]; 
    [requestOperation setCompletionBlockWithSuccess:success failure:failure]; 

    [requestOperation start]; 
} 

전자는 시험에 사용되는 도우미, 후자는 실제로 생산 코드에 의해 호출됩니다. 대기열 크기가 명시 적으로 설정된 코드가 표시되지 않습니다.

+0

사용중인 버전 번호에 대해 구체적으로 설명하십시오. 대기열 동시 수를 기록 했습니까? 또한 사용중인 코드를 표시하십시오. 큐 크기가 명시 적으로 1로 설정되는 경우도 있습니다. – Wain

+0

@Wain Updated. 어디서나 대기열 크기를 설정하지 않고 표준'properObjectRequestOperationWithObject : method : path : parameters :'호출 만하고 있습니다. –

답변

1

RKObjectRequestOperation은 모든 인스턴스간에 공유되는 내부 대기열 (responseMappingQueue)을 포함합니다. 이 대기열은 동시성 개수가 1로 명시 적으로 설정되지만 URL 연결이 아닌 매핑에 사용됩니다.

당신이하고있는 일을 살펴보면서, 작업에 직접 start을 호출하면 작업을 대기열에 추가하여 작업을보다 잘 관리 할 수 ​​있다고 생각할 가능성이 큽니다. 조작을 실행하기 위해 오브젝트 관리자를 사용하지 않으므로 참조하는 5의 동시 수는 적용되지 않습니다. enqueueObjectRequestOperation:을 사용하여 작업을 실행하십시오.

+0

그래서 명시 적으로'start'를 호출하는 대신'RKManagedObjectRequestOperation'으로'enqueueObjectRequestOperation'을 호출해야합니까? –

+1

예, 좋습니다. 당신은 당신 자신의 작업 큐를 생성하여 그것을 추가 할 수 있지만, 객체 관리자를 사용하면 더 좋습니다. 일반적으로, 나는 직접 조작을 사용하지 않을 것이고, 나는 모든 것에 객체 관리자를 가질 것이다. – Wain

관련 문제