2012-03-02 49 views
11

Tôi đã tự hỏi nguyên tắc "thực hành tốt nhất" là gì khi sử dụng Facebook iOS SDK.iOS Facebook SDK - Thực tiễn tốt nhất?

Cụ thể - Tôi có một số biểu mẫu sử dụng SDK Facebook. Bản năng ban đầu của tôi với tư cách là một lập trình viên OOP là tạo một lớp "FacebookManager" dưới lớp truy cập dữ liệu của tôi để xử lý tất cả hoạt động trên Facebook. Thật không may vì Facebook iOS SDK sử dụng các đại biểu và các phương thức không đồng bộ, điều này không hữu ích vì bất kỳ mô-đun nào khác sử dụng FacebookManager sẽ phải chuyển giao các đại biểu cho tất cả các phản hồi.

Sau đó, tôi thấy rằng mỗi ViewController sẽ là một FBRequestDelegate của chính nó và xử lý tất cả các phản ứng Facebook.

Vì vậy, bạn làm điều đó như thế nào trong ứng dụng của mình?

Trả lời

5

Điều tôi đã làm là tạo một Trình quản lý Facebook như bạn đã đề xuất. Người quản lý này trở thành FBRequestDelegate. Bây giờ tôi thích các khối cho mô hình ủy nhiệm nên tất cả các phương thức FacebookManager của tôi đều dựa trên khối.

Đây là những gì bài của tôi để phương pháp tường của người dùng trông giống như

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

} 

Sau đó, vào một thành công hay lỗi tôi chỉ thực hiện khối

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

Tôi muốn có một cách tốt hơn để đối phó với khối nhưng đó là một trong những tốt nhất tôi đã tìm thấy cho đến nay. Đây có phải là cách tốt nhất để làm điều đó không? Có lẽ không nhưng đó là những gì tôi hiện đang sử dụng và nó có vẻ là ok, giữ tất cả các tương tác FB ra khỏi View Controllers của tôi.

Lưu ý tất cả các mã ở đây giả định ARC đó là lý do tại sao không có phiên bản

+0

Tại sao 2 dòng cuối cùng trong hàm PostToWall không được đảo ngược? Bạn chạy yêu cầu và THEN thêm khối làm tham số cho nó? Tôi không hiểu ... –

+0

Sự hiểu biết của tôi là yêu cầu được nạp tiền và nó không được thực hiện cho đến khi runloop thời gian tiếp theo được chạy. Đó là lý do tại sao có vẻ như yêu cầu nên đi ra trước khi khối được thêm vào tuy nhiên trong thực tế nó được thực hiện trên lần chạy tiếp theo của vòng lặp chạy sau khi khối được thêm – ribeto

+0

Tôi đã kết thúc bằng cách sử dụng ví dụ của bạn. Cảm ơn. –

0

Một nhà quản lý Facebook, cơ bản là một wrapper trên Facebook sdk là con đường để đi. Dưới đây là một vài mẹo về cách quản lý nó.

1) Sửa đổi định nghĩa giao thức của SDK của Facebook và thực hiện các định nghĩa giao thức bạn không cần làm tùy chọn, do đó bạn sẽ không phải triển khai chúng.

2) Xử lý tất cả các hoạt động phiên, đăng nhập/đăng xuất, đại biểu, giao thức, v.v. trong lớp người quản lý này. Nói cách khác, người quản lý này thực hiện tất cả các giao thức được xác định bởi sdk Facebook.

3) Xác định giao thức của riêng bạn trong lớp người quản lý và thực hiện tất cả các phương thức giao thức tùy chọn, vì vậy mọi bộ điều khiển chế độ xem có thể xác định những gì nó thực sự cần.

4) Một số wrappers hữu ích sẽ có ích, như,

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

5) Sẽ thật dễ dàng để thêm giấy gói nếu bạn cần nhiều tính năng hơn cho viewControllers bạn

Rất nhiều mã nguồn mở là có sẵn (github tìm kiếm) nhưng một lớp người quản lý tùy chỉnh không khó để viết và có thể dễ dàng được chuyển đến các dự án khác.

Hy vọng điều đó sẽ hữu ích.

0

Chúng tôi đã xây dựng một thư viện khá rộng rãi sẵn sàng để sử dụng để tích hợp facebook.Xem tại đây:

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

Phần mở rộng của nó trên khung công tác Ba20. Bạn có thể dễ dàng sửa đổi thư viện này để độc lập với Three20, nếu bạn muốn.

Về cơ bản chúng tôi đã xác định các đối tượng cho từng đối tượng Graph API. JSON được trả về từ Graph API được đọc vào các đối tượng này.

Các vấn đề liên quan