iOS Facebook SDK - лучшие практики? - PullRequest
11 голосов
/ 02 марта 2012

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 02 марта 2012

Что я сделал, так это создал 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 от моих контроллеров представления.

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

0 голосов
/ 21 июня 2012

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

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

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

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

0 голосов
/ 02 марта 2012

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

1) Измените определения протоколов Facebook 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) Было бы легко добавить оболочки, если вам нужны дополнительные функции для ваших viewControllers

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...