Несколько 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]; 
  • Как обращаться с RestKit вложенным массивом идентификационных ссылок на объекты, которые еще не существуют?
  • Как включить ведение журнала рестайтов в быстром режиме
  • Что вы предпочитаете как клиент RESTful - RestKit vs Resty
  • Restkit Добавить пользовательские значения при сопоставлении
  • Основные данные ядра «Не удалось вызвать назначенный инициализатор при ошибке класса NSManagedObject» при десериализации JSON во вложенную основную структуру данных
  • RestKit: подключение отношения, которое не находится в ответе
  • Дезаминирование локальной NSString JSON на объекты через RestKit (без загрузки сети)
  • Отображение привязки RelKit по ID по URL-адресу
  • Блоки завершения RestKit работают в основном потоке пользовательского интерфейса?
  • Как я могу настроить CocoaPods на использование https://github.com/RestKit/cocoa-oauth вместо устаревшего?
  • Множество объектов RKbjectManagers для RestKit
  • Interesting Posts

    post application / x-www-form-urlencoded Alamofire

    Как разрешить пользователю выбирать изображение с помощью Swift?

    Создание разделов с помощью NSFetchedResultsController, на лету

    Вертикальное scrollview, конфликтующее с вертикальной навигацией

    Не удается получить локальные данные (закрепленные объекты) из Parse Local Datastore

    Получить сенсорную позицию google maps iOS

    Совместное использование проекта, но не кода, с помощью тестера

    OCR Tesseract устанавливает только номера

    Добавить панель управления в UITabbarcontroller в iOS

    Как определить, что приложение iOS работает на телефоне с джейлбрейком?

    iOS: эквивалент strings.xml в приложении для приложений iOS?

    Как я могу получить время моего записанного звука в iphone?

    Возможно ли, чтобы класс object-c реализовал быстрый протокол в .h

    Переход анимации NavigationController без анимации панели навигации

    Получить ABRecordID из недавно добавленного объекта адресной книги ios

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