RestKit RKЗапросы не отправляются сразу - PullRequest
2 голосов
/ 20 января 2012

Я использую великолепный RestKit Framework для приложения iPhone. У меня есть метод, при котором я отправляю запросы в веб-сервис. Иногда четыре или более запросов в 30 секунд.

Мой sendMethod выглядит так:

 - (void) sendLocation {

NSString *username = [userDefaults objectForKey:kUsernameKey];    
NSString *password = [userDefaults objectForKey:kPasswordKey];
NSString *instance = [userDefaults objectForKey:kInstanceKey];
NSString *locationname = self.location.locationname;

NSString *url = [[NSString alloc] initWithFormat:@"http://www.someadress.com/%@", instance];

RKClient *client = [RKClient clientWithBaseURL:url username:username password:password];

// Building my JsonObject
NSDictionary *locationDictionary = [NSDictionary dictionaryWithObjectsAndKeys: username, @"username", locationname, @"locationname", nil];
NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys:locationDictionary, @"location", nil];

NSString *JSON = [jsonDictionary JSONRepresentation];
RKParams *params = [RKRequestSerialization serializationWithData:[JSON dataUsingEncoding:NSUTF8StringEncoding]MIMEType:RKMIMETypeJSON]; 

[client  post:@"/locations" params:params delegate:self];
 }

Иногда (особенно при отправке большего количества запросов за другим) значение свойства count объекта RKRequestQueue составляет> 1. Когда мое приложение переходит в фоновый режим, а затем переходит на передний план, запросы в очереди (при вводе переднего плана) отправляются на мой веб-сервис и делегату

- (void)request:(RKRequest*)request didLoadResponse:(RKResponse*)response {)

для всех запросов будет вызвано.

Итак, вопрос: Почему RestKit не отправляет некоторые запросы сразу (мой веб-сервис ничего не получает, пока запрос хранится в очереди) ???

Кто-нибудь знает решение или имел / имеет такую ​​же проблему?

1 Ответ

3 голосов
/ 07 февраля 2012

Я заметил эту строку, где вы создаете RKClient:

RKClient *client = [RKClient clientWithBaseURL:url username:username password:password];

Это в основном создает новый экземпляр каждый раз, когда вызывается метод sendLocation - вы уверены, что это ваше поведение? Если URL, имя пользователя и пароль не меняются, вы можете получить доступ к ранее созданному клиенту, позвонив по номеру [RKClient sharedClient] . В вашем текущем подходе новая очередь запросов создается для каждого нового клиента.

Теперь вернемся к делу. Посмотрите на это свойство RKRequestQueue :

/**
* The number of concurrent requests supported by this queue
* Defaults to 5
*/
@property (nonatomic) NSUInteger concurrentRequestsLimit;

Как вы видите, по умолчанию это 5, поэтому, если у вас их больше, чем в любой из ваших очередей, они будут ждать обработки текущих запросов. Вы также упомянули, что запросы складываются, когда приложение перемещается в фоновый режим, а затем, когда оно выходит на передний план, все они отправляются. Вы можете контролировать, как ваши запросы ведут себя так:

- (void)backgroundUpload {
    RKRequest* request = [[RKClient sharedClient] post:@"somewhere" delegate:self];
    request.backgroundPolicy = RKRequestBackgroundPolicyNone; // Take no action with regard to backgrounding
    request.backgroundPolicy = RKRequestBackgroundPolicyCancel; // If the app switches to the background, cancel the request
    request.backgroundPolicy = RKRequestBackgroundPolicyContinue; // Continue the request in the background
    request.backgroundPolicy = RKRequestBackgroundPolicyRequeue; // Cancel the request and place it back on the queue for next activation
}

Я нашел это решение здесь . Прокрутите вниз до Фоновая загрузка / загрузка раздел.

...