【问题标题】:RestKit - Request blocks until previous call completesRestKit - 请求阻塞,直到上一个调用完成
【发布时间】:2014-04-28 13:05:37
【问题描述】:

我看到 RestKit 存在问题,未完成的远程请求将导致其他请求排队并阻塞,直到前一个请求完成。我已经读到 RestKit 将 AFNetworking 的 setMaxConcurrentOperationCount 值默认为 5,但我遇到的只是一个未完成的请求而阻塞。

当前版本的 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];
}

前者是用于测试的助手,而后者实际上是由生产代码调用的。我的代码中没有看到明确设置队列大小的任何地方。

【问题讨论】:

  • 具体说明您使用的版本号。您是否记录了队列的并发计数?另外,显示您正在使用的代码,有时队列大小明确设置为 1。
  • @Wain 已更新。我没有在任何地方设置队列大小,我只是进行标准的appropriateObjectRequestOperationWithObject:method:path:parameters: 调用。

标签: restkit nsoperation nsoperationqueue restkit-0.20


【解决方案1】:

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

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

【讨论】:

  • 所以我应该用RKManagedObjectRequestOperation 调用enqueueObjectRequestOperation 而不是显式调用start 吗?
  • 是的,这将是推荐的方法。您可以创建自己的操作队列并将其添加到其中,但使用对象管理器会更好。一般来说,我不会直接使用这些操作,我会使用对象管理器来处理所有事情......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
  • 2021-07-30
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多