2012-03-02 43 views
11

Me preguntaba cuáles son las pautas de "mejores prácticas" para usar el SDK de iOS de Facebook.iOS Facebook SDK - ¿Mejores prácticas?

Específicamente - Tengo varios formularios que usan el SDK de Facebook. Mi instinto inicial como programador OOP fue crear una clase "FacebookManager" en mi capa de acceso a datos que maneja todas las actividades de Facebook. Desafortunadamente, dado que el iOS SDK de Facebook usa delegados y métodos asincrónicos, esto no es tan útil ya que cualquier otro módulo que use FacebookManager tendrá que pasar delegados para todas las respuestas de todos modos.

Luego me di cuenta de que cada ViewController sería un FBRequestDelegate por sí mismo y manejaría todas las respuestas de Facebook.

Entonces, ¿cómo lo haces en tu aplicación?

Respuesta

5

Lo que he hecho es crear un FacebookManager como sugirió. Este administrador se convierte en FBRequestDelegate. Ahora prefiero los bloques al modelo de delegación, por lo que todos mis métodos de FacebookManager están basados ​​en bloques.

Esto es lo que mi post con el método de la pared de un usuario se parece

- (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"]; 
    } 

} 

Luego de un éxito o un error que acaba de ejecutar el bloque

- (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]; 
} 

Me gustaría que hubiera una mejor manera de hacer frente con el bloque, pero ese es el mejor que he encontrado hasta ahora. ¿Es esta la mejor manera de hacerlo? Probablemente no, pero eso es lo que uso actualmente y parece estar bien, manteniendo toda la interacción FB lejos de mis View Controllers.

Nota todo el código que aquí asume ARC es por eso que no hay comunicados

+0

¿Por qué no se invierten las 2 últimas líneas de la función PostToWall? ¿Ejecutas la solicitud y luego agregas el bloque como parámetro? No lo entiendo ... –

+0

Según tengo entendido, la solicitud se prepara y no se ejecuta hasta la próxima ejecución de runloop. Es por eso que parece que la solicitud debe salir antes de que se agregue el bloque, sin embargo, en la práctica se ejecuta en el siguiente paso del ciclo de ejecución después de agregar el bloque – ribeto

+0

Terminé usando su ejemplo. Gracias. –

0

un gestor de Facebook, básicamente un envoltorio sobre Facebook SDK es el camino a seguir. Aquí hay algunos consejos sobre cómo administrarlo.

1) Modifique las definiciones de protocolo de SDK de Facebook y haga que las que no necesita como opcionales por lo que no tenga que implementarlas.

2) Maneje todas las actividades de sesión, inicio de sesión/cierre de sesión, delegados, protocolos, etc. en esta clase de administrador. En otras palabras, este administrador implementa todos los protocolos definidos por el SDK de Facebook.

3) Defina su propio protocolo en la clase de administrador y haga que todos los métodos de protocolo sean opcionales, para que cada controlador de vista pueda definir lo que realmente necesita.

4) Algunas envolturas votos serían útiles, como,

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

5) Sería fácil añadir envoltorios si necesita más características para sus viewControllers

Una gran cantidad de código fuente abierto es disponible (buscar github) pero una clase de administrador personalizado no es difícil de escribir y se puede transferir fácilmente a otros proyectos.

Espero que ayude.

0

Hemos creado una biblioteca bastante extensa lista para usar para la integración de Facebook.Ver aquí:

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

Su una extensión en el marco Three20. Puede modificar fácilmente esta biblioteca para que sea independiente de Three20, si lo desea.

Básicamente, tenemos objetos definidos para cada objeto Graph API. JSON devuelto desde Graph API se lee en estos objetos.

Cuestiones relacionadas