RestKit RKRequests не отправляются сразу

Я использую отличный 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 не отправляет некоторые запросы сразу (мой веб-сервис ничего не получает, пока запрос хранится в очереди)???

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


person android    schedule 20.01.2012    source источник


Ответы (1)


Я заметил эту строку, где вы создаете 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
}

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

person lawicko    schedule 07.02.2012