2011-01-20 56 views
9

有沒有辦法取消Facebook對象的待處理請求?Facebook Facebook SDK的Facebook類有取消方法嗎?

我在Facebook.h中找不到任何方法,或者訪問底層NSURLConnection對象的方法。如果我按下導航欄並且它們是待處理的異步Facebook請求,則該請求會嘗試在響應到達時將消息發送到釋放的view,導致應用程序崩潰。

回答

7

編輯 正如蒂姆回答這個問題指出,這一信息是現在Facebook的iOS版SDK的最新版本已經過時了。

無法取消掛起的請求。但是,這不應該讓你的應用崩潰。

Facebook類使用FBRequest類來引用其所有的REST或圖形API請求,並且這是以view(controller?)引用作爲其委託屬性的類。縱觀標題爲FBRequest

@interface FBRequest : NSObject { 
    id<FBRequestDelegate> _delegate; 
    NSString*    _url; 
    NSString*    _httpMethod; 
    NSMutableDictionary* _params; 
    NSURLConnection*  _connection; 
    NSMutableData*  _responseText; 
} 

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

在申報財產的分配屬性使它看起來它存儲弱裁判類,但隨後在FBRequest.m:

+ (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

謝謝,你救了我的一天。 – 2012-04-26 11:28:08

9

對於任何人遇到這個問題,似乎馬特的觀察不適用於最新的facebook-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完成之前解除分配。

更新:

可能的解決方法建議在this問題,讓未決FBRequests取消。

更新2:

爲了避免在委託被釋放的FBRequest完成之前,你需要爲你解除分配委託(這基本上是什麼馬特建議取消活動FBRequest的連接的情況下崩潰在鏈接的問題)。但是(我不確定這是否是新的),您可以直接對FBRequest執行此操作,因爲它暴露了它的NSURLConnection屬性。所以,如果你保留你FBRequest對象的屬性:

@property (nonatomic, retain) FBRequest *myRequest; 

並保存請求對象當你使您的來電:

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

你可以在你的dealloc清理了一切:

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

    ... 

    [super dealloc]; 
} 

很明顯,您應該在處理完響應後釋放並在委託方法中釋放FBRequest屬性。

+1

關於此問題,有一個[未解決的問題](https://github.com/facebook/facebook-ios-sdk/issues/220)。 – albertamg 2011-05-25 16:20:17