Несколько RKObjectManager за раз (RestKit)

Я тестирую RestKit и нуждаюсь в доступе к различным BaseUrls, а также иногда получаю доступ к веб-сервису с одним и тем же baseUrl из разных мест «сразу», и, наконец, мне также нужно получить доступ к тому же baseUrl с разными параметрами ressourcePath в том же контроллере.

В моем делете приложения я установил singleton RKObjectManager, как это.

RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:kBaseUrl]; [objectManager registerClass:[EntityClass1 class] forElementNamed:@"element1"]; [objectManager registerClass:[EntityClass2 class] forElementNamed:@"element2"]; . . . etc. 

Одиночный подход очень прост в работе, но я не могу понять, как разделить различные вызовы веб-сервисов.

В MyViewController, которые реализуют RKObjectLoaderDelegate, у меня будут два метода:

 - (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects { //stuff with result } - (void)objectLoader:(RKObjectLoader *)objectLoader didFailWithError:(NSError *)error { //stuff with error } 

Это не создает проблем, когда MyViewController использует один синглтон RKObjectManager для доступа к одному серверу ressourcePath с одним baseUrl.

Если я запускаю разные запросы таким образом:

 [[RKObjectManager sharedManager] loadObjectsAtResourcePath:FLICKRPath delegate:self] [[RKObjectManager sharedManager] loadObjectsAtResourcePath:FOURSQUAREPath delegate:self] 

и так далее, в том же MyController, моя проблема в том, что FLICKRPath и FOURSQUAREPath, конечно, имеют разные baseUrl, но у RKObjectManager только один?

Если я получу эту работу и могу иметь разных RKObjectManager, возникает другая проблема. Методы делегата didLoadObjects и didFailWithError получат результаты от RKObjectManagers, и я не вижу другого способа рассказать их обособленно, чем от их baseUrls. Потенциально сравнивая каждое возвращаемое значение с baseUrl и, что еще хуже, ressourcePath, в методе делегата вообще не обращается ко мне.

Если у меня разные менеджеры RKObjectManager, я думаю, я мог бы передавать им разные делегаты и создавать классы, предназначенные для обработки возвращаемых значений из разных baseUrls и ressourcePaths. Это означало бы, что я должен был создать еще одну абстракцию поверх MyController и RestKit, что также кажется беспорядочным.

У меня есть сильное чувство, что я делаю это неправильно, источник RestKit очень впечатляет, что указывает на то, что я борюсь с каркасом. Я был бы очень признателен за понимание лучшей практики на эту тему. Я прошел через все ресурсы и примеры, которые мог найти, но не видел вышеупомянутого варианта использования. Это всегда один RKObjectManager, один baseUrl и один ressourcePath.

Заранее спасибо.

5 Solutions collect form web for “Несколько RKObjectManager за раз (RestKit)”

Поскольку ответа еще нет: использование нескольких менеджеров объектов довольно просто с помощью RestKit .

Из Wiki ( использование нескольких базовых URL-адресов (и нескольких менеджеров объектов ):

Первым создателем объекта, который вы создаете, будет общий выделенный элемент RestKit по умолчанию. Но, создав дополнительных диспетчеров объектов, вы можете потянуть их из своих BaseURL по мере необходимости, просто обязательно сохраните этих новых менеджеров.

 RKObjectManager *flickrManager = [RKObjectManager objectManagerWithBaseURL:flickrBaseUrl]; // <-- shared singleton RKObjectManager *foursquareManager = [[RKObjectManager objectManagerWithBaseURL:foursquareBaseUrl] retain]; // <-- you must retain every other instance. 

В зависимости от вашего приложения, вы можете захотеть разместить этот второй диспетчер объектов в более доступном месте, например, сохраненное свойство в AppDelegate, так что его легко извлечь из по мере необходимости. В случае, если вам нужно провести различие между результатами ваших двух (или более) объектных менеджеров, просто установите идентификатор в userData для запросов.

 - (void)someAction(id)sender { // ....... RKObjectLoader* loader = [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/whatever" delegate:self]; loader.userData = @"foursquare"; // or do this, if you need a number instead of a string loader.userData = [NSNumber numberWithInt:1234]; // ....... } //Then when the delegate comes back you can cast it into a string or number as appropriate: - (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects { // ....... NSString* source = (NSString*) objectLoader.userData; // or, if you did the NSNumber instead: NSNumber* source = (NSNumber*) objectLoader.userData; // ....... } 

Изменение API:

 RKObjectLoader* loader = [[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/whatever" delegate:self]; 

не компилируется в RestKit v.0.10.3 (loadObjectsAtResourcePath: delegate: возвращает void). Однако этот метод просто обертывает несколько строк кода, поэтому вы все равно можете добраться до загрузчика и добавить userData со следующим:

 RKObjectLoader *loader = [[RKObjectManager sharedManager] loaderWithResourcePath:resourcePath]; loader.userData = @"SOMEDATA"; loader.delegate = self; loader.method = RKRequestMethodGET; [loader send]; 

(добавление примечания, если другие новые пользователи столкнутся с теми же проблемами, что и я).

И, кстати, поскольку свойство userData также доступно в RKRequest, вы можете использовать тот же подход для загрузки / идентификации запросов.

Например, некоторый почтовый запрос:

 RKClient * client = [RKClient sharedClient]; [client post:@"/your-api-path" usingBlock:^(RKRequest *request) { request.userData = @"<some-object-you-can-check-in-delegate-callback>"; request.params = someParamsForRequest; request.delegate = <delegate you want to call when request is finished>; }]; 

Как насчет использования objectLoader. Вы найдете сопоставленный тип объекта / класс objectLoader.objectMapping.objectClass и добавьте свои условия на его основе вместо URL- objectLoader.objectMapping.objectClass

 -(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects { // your condition based on -> objectLoader.objectMapping.objectClass } 

Надеюсь, это поможет

Возможным подходом является введение одного синглтона для каждого базового url .

Вы можете создать столько объектов RKObjectManager сколько захотите. Тем не менее, только первый станет общим. Посмотрите на initWithHTTPClient: источники .

 if (nil == sharedManager) { [RKObjectManager setSharedManager:self]; } 

Мы не можем использовать метод sharedManager умолчанию для целевого диспетчера объектов, но мы можем легко реализовать собственный синглтон. Вот пример для диспетчера объектов Google Maps:

 @implementation GMObjectManager + (GMObjectManager*)sharedManager { static GMObjectManager *manager; // keep reference if (!manager) { // init with custom base url NSURL *baseUrl = [NSURL URLWithString:kGMBaseUrl]; manager = [GMObjectManager managerWithBaseURL:baseUrl]; } return manager; } - (id)initWithHTTPClient:(AFHTTPClient *)client { self = [super initWithHTTPClient:client]; if (self) { // additional initialization } return self; } @end 

Применение:

 CGObjectManager *googleMapsManager = [GMObjectManager sharedInstance]; 
  • Свойство BOOL объекта RESTKit для true / false JSON
  • Производительность и основные данные RestKit
  • Нужна помощь для сценария синхронизации данных RestKit
  • Ошибка сопоставления одного объекта JSON в Restkit
  • Ошибка компоновщика RestKit
  • Целевая целостность. Файл «Pods-ios.xcconfig» не может быть открыт, потому что его путь не может быть разрешен. Возможно, он отсутствует "
  • Используйте вилку Restkit на github через cocoaPod?
  • RestKit: Как обрабатывать пустой response.body?
  • Не удается архивировать проект эпохи iOS 5.0 с помощью RestKit v0.10.3 с использованием Xcode 7.2
  • RestKit 0.2 Подключение к недействительному сертификату безопасности HTTPS
  • Как мне связать объекты Core Data для использования с RestKit?
  • Interesting Posts

    Как перенести данные, добавленные в глобальный массив swift 2

    Отображать только формат времени 12 часов с отметки времени ISO 8601

    iOS: Обнаружение, если touchEnded происходит от сползания экрана или подъема пальца?

    Как сделать снимок экрана всего экрана на устройстве Jailbroken iOS?

    Создайте круг с несколькими цветами

    Как запустить единовременный код установки перед выполнением любого XCTest

    В чем смысл showReorderControl?

    UITableView сбой при одновременном выборе одной и той же строки

    Невозможно преобразовать apple developer_identity.cer в формат .p12. Сертификат не соответствует закрытому ключу

    AVFoundation, срезанные края в слое предварительного просмотра

    Когда использовать takeUnretainedValue () или takeRetainedValue () для извлечения неуправляемых объектов в Swift?

    iOS 7 выдает BAD_ACCESS при использовании UIImagePickerController

    Передача данных из модального вида в WatchKit

    Swift Video Resizer AVAsset

    Ошибка: CoreData: warning: Невозможно загрузить класс с именем '' для сущности 'Receipt'. Но класс удаляется

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.