Как указать поддержку многозадачности в RestKit 0.20.x?

RestKit используется для поддержки многозадачности с использованием следующего фрагмента кода:

RKRequest* request = [[RKClient sharedClient] post:@"/upload" delegate:self];
request.backgroundPolicy = RKRequestBackgroundPolicyContinue;

Я просматриваю последние версии (0.20.x) и не вижу ссылок на перечисление фоновой политики. Кто-нибудь знает, как это вызвать в последней версии RestKit?

РЕДАКТИРОВАТЬ: Per Wain ответил ниже, я обнаружил, что вы можете сделать это для метода GET следующим образом:

RKHTTPRequestOperation *requestOperation = [[RKHTTPRequestOperation alloc] initWithRequest:[NSURLRequest requestWithURL:url]];    
[requestOperation setShouldExecuteAsBackgroundTaskWithExpirationHandler:nil];

RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc] initWithHTTPRequestOperation:requestOperation responseDescriptors:@[responseDescriptor]];
[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    // handle success
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    // handle failure
}];

[operation start];

Но похоже, что для POST не существует эквивалента, поскольку метод POST RKObjectManager создает внутри себя RKObjectRequestOperation и не предоставляет к нему доступ.

Кто-нибудь знает, есть ли другой способ установить это? В противном случае, я полагаю, я мог бы создать свой собственный метод расширения, который обеспечивает доступ к этому параметру.


person lehn0058    schedule 30.05.2013    source источник


Ответы (1)


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

Редактировать: Приносим извинения за недоразумение. Я понимаю, что фоновые задачи теперь должны решаться либо вне RestKit, либо с помощью AFNetworking.

При использовании маршрута AFNetworking он обрабатывается как часть AFURLConnectionOperation, который предлагает метод setShouldExecuteAsBackgroundTaskWithExpirationHandler:.

Публикация — это просто оболочка:

RKObjectRequestOperation *operation = [self appropriateObjectRequestOperationWithObject:object method:RKRequestMethodPOST path:path parameters:parameters];
[operation setCompletionBlockWithSuccess:success failure:failure];
[self enqueueObjectRequestOperation:operation];

Таким образом, ваши самые простые варианты использования маршрута AFNetworking — создать подкласс RKObjectManager и переопределить postObject: или просто создать RKObjectRequestOperation вручную (в вашем собственном служебном методе). Затем откройте свойство RKObjectRequestOperation HTTPRequestOperation.

person Wain    schedule 30.05.2013
comment
Я спрашивал о многозадачности, а не о многопоточности. Вы правы в том, что многопоточность происходит по умолчанию, но многозадачность — это функция iOS, на которую вы можете подписаться, чтобы продолжить выполнение в течение короткого времени после того, как ваше приложение перешло в фоновый режим. Это то, что использовало перечисление фоновой политики, и я ищу, есть ли у него замена, поскольку, похоже, его больше не существует. - person lehn0058; 31.05.2013
comment
Это меня очень близко! Я могу понять, как я могу использовать setShouldExecuteAsBackgroundTaskWithExpirationHandler для метода GET, но объект, который имеет этот метод, находится на один уровень слишком глубоко, чтобы я мог настроить его для методов POST. Я полагаю, что мог бы написать метод расширения, но прежде чем я это сделаю, знаете ли вы какой-либо способ настроить это для POST? - person lehn0058; 31.05.2013
comment
А, это имеет смысл. Спасибо за вашу помощь! - person lehn0058; 31.05.2013