IOS Facebook SDK - лучшие практики?

Мне было интересно, какие рекомендации "лучшей практики" предназначены для использования SDK для iOS для Facebook.

В частности - у меня есть несколько форм, в которых используется SDK для Facebook. Мой первоначальный инстинкт в качестве программиста OOP заключался в создании класса "FacebookManager" под моим уровнем доступа к данным, который обрабатывает всю активность в Facebook. К сожалению, поскольку Facebook iOS SDK использует делегаты и асинхронные методы, это не так полезно, поскольку любой другой модуль, использующий FacebookManager, должен был бы передать делегатам все ответы.

Затем я понял, что каждый ViewController будет FBRequestDelegate сам по себе и обрабатывает все ответы в Facebook.

Итак, как вы это делаете в своем приложении?

Ответ 1

Что я сделал, так это создать FacebookManager, как вы предложили. Этот менеджер становится FBRequestDelegate. Теперь я предпочитаю блокировать модель делегирования, поэтому все мои методы FacebookManager основаны на блоках.

Вот что мой пост для метода пользовательской стены выглядит как

- (void)postToUserWall:(NSDictionary*)postDictionary withCompleteHandler:(void(^)(id result, NSError* error))block {


  if( [facebook_ isSessionValid] ) {
    NSMutableDictionary* params = [postDictionary mutableCopy];
    [params setObject:facebook_.accessToken forKey:@"access_token"];
    FBRequest* request = [facebook_ requestWithGraphPath:@"me/feed" andParams:[postDictionary mutableCopy] andHttpMethod:@"POST" andDelegate:self];
    [[request params] setObject:block forKey:@"result"];
  }

}

Затем по успеху или ошибке я просто выполняю блок

- (void)processRequest:(FBRequest*)request withResult:(id)result andError:(NSError*)error {
  NSDictionary* params = [request params];
  if( [request params] != nil && [params objectForKey:@"result"] != nil ) {
    void(^completeBlock)(id result,NSError* error) = [params objectForKey:@"result"];
    completeBlock(result, nil);
  }
}


- (void)request:(FBRequest *)request didLoad:(id)result {
  [self processRequest:request withResult:result andError:nil];
}


- (void)request:(FBRequest *)request didFailWithError:(NSError *)error {
  [self processRequest:request withResult:nil andError:error];
}

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

Обратите внимание, что все коды здесь предполагают ARC, почему нет релизов

Ответ 2

Менеджер Facebook, в основном обертка через Facebook sdk - это путь. Вот несколько советов о том, как управлять им.

1) Измените определения протокола FTP SDK и сделайте те, которые вам не нужны, как необязательные, поэтому вам не придется их реализовывать.

2) Управлять всеми сеансами, входами/выходами, делегатами, протоколами и т.д. в этом классе менеджера. Другими словами, этот менеджер реализует все протоколы, определенные в sdk Facebook.

3) Определите свой собственный протокол в классе менеджера и сделайте все методы протокола опционными, поэтому каждый контроллер представления может определить, что ему действительно нужно.

4) Полезные обертки были бы полезны, например,

- (void) postToFriend: (Record*) f_record withMessage: (NSString*) message;
- (void) resumeSession; // checks, resumes session, extend token, or report error

5) Было бы легко добавить обертки, если вам нужно больше функций для вашего монитора просмотра.

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

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

Ответ 3

Мы создали довольно обширную библиотеку, готовую для использования для интеграции facebook. См. Здесь:

https://github.com/RIKSOF/three20/tree/development/src/extThree20Facebook

Его расширение на платформе Three20. Вы можете легко изменить эту библиотеку, чтобы быть независимой от Three20, если хотите.

В основном мы определяем объекты для каждого объекта Graph API. JSON, возвращенный из Graph API, считывается с этими объектами.