Могу ли я использовать блоки в асинхронных результатах с restkit? - PullRequest
5 голосов
/ 22 октября 2011

- ОБНОВЛЕНИЕ: Я решил попробовать AFNetworking.Несмотря на то, что RestKit обладает действительно приятной функциональностью сопоставления объектов, способ, которым были разработаны сетевые вызовы, усложнил нам некоторые вещи.

Я надеюсь получить несколько советов о том, как организовать мой проект, использующий RestKit.

У меня есть несколько вызовов REST из класса репозитория, и его результаты передаются контроллерам.Например, у меня есть метод getProfile в классе репозитория, который вызывается из нашего контроллера представления обзора.Контроллер представления установлен как делегат для вызовов профиля получения, в то время как класс репозитория установлен для делегата для вызовов restkit.

Проблема в том, что, если контроллер просмотра делает несколько запросов профиля, трудноразличать, какой результат должен идти к какой функции делегата, поскольку все вызовы restkit используют один и тот же метод делегата objectLoaderDidFinishLoading.Затем у меня есть 4 делегата, которым я должен сопоставить результаты 4 асинхронных запросов на рестит.

Есть ли способ использовать блоки, чтобы я мог передать функцию для выполнения, так как асинхронный результат возвращается так, чтоЯ могу назначить подходящего делегата?Поддержка блоков, которую я видел, позволила использовать блок до того, как запрос был отправлен в rest kit, но я заинтересован в том, чтобы использовать его, когда возвращается асинхронный результат.

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

Ответы [ 4 ]

4 голосов
/ 28 октября 2011

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

0 голосов
/ 21 декабря 2011

Переход на AFNetworking, кажется, был бы подходящим вариантом ... это было намного проще для реализации того, что мне было нужно.

0 голосов
/ 28 октября 2011

Я не уверен, что использование блоков - верный способ решить вашу проблему.

Как насчет наличия класса GetProfile, который реализует RKObjectLoaderDelegate.Таким образом, вы вызываете запрос изнутри и устанавливаете себя в качестве делегата.Тогда у вас есть objectLoader для каждого запроса.

Итак, в вашем контроллере представления каждый раз, когда вы запускаете GetProfile, вы создаете экземпляр.И затем, когда этот экземпляр отправляет ваш контроллер назад (через делегатов?), Вы знаете, что это такое.

Я также просто занимаюсь этой проблемой, поэтому очень хочу услышать отзывы.

0 голосов
/ 26 октября 2011

Я просто наткнулся на этот вопрос, пытаясь выяснить эту проблему для моего собственного интерфейса REST.Я рад, что я сделал, я, вероятно, теперь буду использовать RestKit.

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

Может быть что-то подобное?

@interface MyObjectLoaderDelegate : NSObject <RKObjectLoaderDelegate>

@property (nonatomic, copy) void (^callback)(RKObjectLoader *loader, NSDictionary *objectDictionary, NSError *error)

- (id)initWithCallback:(void (^)(RKObjectLoader*, NSDictionary*, NSError*)aCallaback;

@end

И на любомреализован метод делегата, вы можете выполнить блок.Поскольку блоки сохраняют переменные области действия, вы можете запускать код для вызывающего делегата.

Что думаете?

...