2014-04-28 28 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已更新。我不会在任何地方设置队列大小,我只是制作一个标准的'''''''''''''''''''''''''适当的参数:'调用。 –

回答

1

RKObjectRequestOperation包含一个在所有实例之间共享的内部队列(responseMappingQueue)。此队列显式设置并发计数为1,但它仅用于映射,而不用于URL连接。

看看你在做什么,直接调用start直接操作,你很可能想考虑将操作添加到队列中,以便更好地管理它们。由于您没有使用对象管理器来运行这些操作,所引用的并发计数5不适用。看看使用enqueueObjectRequestOperation:来运行这些操作。

+0

所以我应该用'RKManagedObjectRequestOperation'调用'enqueueObjectRequestOperation'而不是明确调用'start'呢? –

+1

是的,这将是推荐的方法。您可以创建自己的操作队列并将其添加到该队列中,但使用对象管理器会更好。一般来说,我不会直接使用操作,我会让对象管理器完成所有操作。 – Wain

相关问题