2011-01-20 4 views
9

Facebook 객체의 보류중인 요청을 취소하는 방법이 있습니까?Facebook Facebook SDK의 Facebook 클래스에는 취소 방법이 있습니까?

Facebook.h에서 메서드를 찾을 수 없거나 기본 NSURLConnection 개체에 액세스 할 수 없습니다. 내비게이션 막대를 다시 누르고 해당 요청이 보류중인 비동기 Facebook 요청 인 경우 요청이 응답을 받으면 할당되지 않은 view에게 메시지를 보내려합니다. 이로 인해 응용 프로그램이 중단됩니다.

답변

7

으로는이 질문에 대한 팀의 대답에 지적 편집이 정보는 페이스 북 아이폰 OS SDK의 최신 릴리스와 지금은 사용되지 않습니다.

보류중인 요청을 취소 할 수있는 방법이 없습니다. 그러나 이것으로 인해 앱이 손상되지 않아야합니다.

클래스는 FBRequest 클래스를 사용하여 REST 또는 그래프 API 요청을 모두 작성합니다.이 클래스는 뷰 (컨트롤러?)에 대한 참조를 위임 속성으로 사용하는 클래스입니다. FBRequest의 헤더를 보면 :

속성 선언에 할당 속성이 FBRequest.m에 다음 있지만, 그것은 당신의 클래스에 약한 심판을 저장하는 것처럼 보일 수 있습니다
@interface FBRequest : NSObject { 
    id<FBRequestDelegate> _delegate; 
    NSString*    _url; 
    NSString*    _httpMethod; 
    NSMutableDictionary* _params; 
    NSURLConnection*  _connection; 
    NSMutableData*  _responseText; 
} 

@property(nonatomic,assign) id<FBRequestDelegate> delegate; 

:

+ (FBRequest *)getRequestWithParams:(NSMutableDictionary *) params 
         httpMethod:(NSString *) httpMethod 
          delegate:(id<FBRequestDelegate>) delegate 
         requestURL:(NSString *) url { 
    FBRequest* request = [[[FBRequest alloc] init] autorelease]; 
    request.delegate  = [delegate retain]; // <- It's retained! (Comment mine) 
    request.url   = [url retain]; 
    request.httpMethod = [httpMethod retain]; 
    request.params  = [params retain]; 
    request.connection = nil; 
    request.responseText = nil; 

    return request; 
} 

에게 그것을 대의원을 분명하게 유지합니다. 따라서 애플리케이션의 정상적인 흐름에서 네비게이션 스택에서 팝업 된 후 뷰 컨트롤러를 할당 해제해야한다고 생각하면 FBRequest은 소유권을 가져옴으로써 응답을받을 수 있도록 보장합니다.

이렇게하면 앱의 다른 곳에서 다른 메모리 관리 문제가있는 것처럼 보입니다.

+0

감사합니다. 내 하루를 저장했습니다. –

9

이 질문을하는 사람은 매트의 관찰이 최신 페이스 북 인 iphone-sdk에는 적용되지 않는 것으로 보입니다.

+ (FBRequest *)getRequestWithParams:(NSMutableDictionary *) params 
         httpMethod:(NSString *) httpMethod 
          delegate:(id<FBRequestDelegate>) delegate 
         requestURL:(NSString *) url { 

    FBRequest* request = [[[FBRequest alloc] init] autorelease]; 
    request.delegate = delegate; 
    request.url = url; 
    request.httpMethod = httpMethod; 
    request.params = params; 
    request.connection = nil; 
    request.responseText = nil; 

그래서 대리인의 메모리 관리는 .H 파일에 다시 속성 선언에 떨어지면 : 매개 변수가 더 이상 명시 적으로 관련 법에 유지되지

@property(nonatomic,assign) id<FBRequestDelegate> delegate; 

이것은 충돌이 지금 의미 FBRequest가 완료되기 전에 대리자 객체를 할당 취소 할 수 있으므로 가능합니다.

업데이트 : 가능한 해결 방법이 보류 FBRequests 취소 할 수 있도록 this 질문에 제안

.

업데이트 2 :

대리인이 FBRequest가 완료되기 전에, 당신은 기본적으로 매트이 시사하는 것입니다있는 (대리자를 할당 해제로 활성 FBRequest의 연결을 취소 할 필요가 해제됩니다 경우 충돌을 방지하기 위해 링크 된 질문에서). 그러나 (이것이 새로운 것인지 확실하지 않습니다.) NSURLConnection 속성을 노출하므로 FBRequest에 직접이 작업을 수행 할 수 있습니다.당신이 속성에 FBRequest 개체를 유지한다면, :

self.myRequest = [facebookObj requestWithGraphPath:@"me" andDelegate:self]; 

당신이 당신의 dealloc에 ​​모든 것을 정리할 수 있습니다 :

- (void)dealloc 
{ 
if(myRequest) { 
    [[myRequest connection] cancel]; 
    [[myRequest release]; 
    } 

    ... 

    [super dealloc]; 
} 
요청 객체를

@property (nonatomic, retain) FBRequest *myRequest; 

저장 당신은 당신의 전화를 걸 때

물론 응답을 처리 한 후에는 대리자 메서드에서 FBRequest 속성을 해제하고 nil해야합니다.

+1

이에 대한 [공개 문제] (https://github.com/facebook/facebook-ios-sdk/issues/220)가 있습니다. – albertamg

+0

by @ user1526896 : 애플리케이션 충돌을 막기 위해 myRequest.delegate = nil;을 추가해야합니다. – Damon

관련 문제