2014-04-28 25 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

相關問題