2011-01-20 9 views
9

Facebookオブジェクトの保留中のリクエストをキャンセルする方法はありますか?iPhone Facebook SDKのFacebookクラスにキャンセル方法がありますか?

Facebook.hでメソッドを見つけることができず、基になるNSURLConnectionオブジェクトにアクセスする方法が見つかりません。ナビゲーションバーを押したままにしておけば、非同期のFacebook要求が保留されていれば、応答が到着してアプリケーションがクラッシュすると、その要求は割り当て解除されたviewにメッセージを送信しようとします。

答えて

7

EDIT この質問へのティムの答えで指摘したように、この情報は今のFacebookのiOS SDKの最新リリースで廃止されました。

保留中のリクエストをキャンセルする方法はありません。しかし、これはあなたのアプリをクラッシュさせるべきではありません。

クラスFBRequestクラスは、RESTまたはGraph APIリクエストをすべて作成するためにクラスを使用します。これは、ビュー(コントローラ?)への参照をデリゲートプロパティとして終了するクラスです。 FBRequestのヘッダを見て:

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

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

プロパティ宣言でアサイン属性は、弱い-REFあなたのクラスにを保存するように見えるが、その後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; 
} 

それは、デリゲートを明確に保持します。したがって、アプリケーションの通常の流れでは、ナビゲーションスタックからポップされた後でView Controllerを割り当て解除する必要があると思うときには、FBRequestは、所有権を取得して応答を受け取ることができるようにしています。

これは、アプリ内の他の場所で他のメモリ管理の問題があるように見えるようにします。

+0

ありがとう、あなたは私の一日を救った。 –

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が完了する前にデリゲートオブジェクトを割り当て解除できるためです。

更新:可能な回避策は保留FBRequestsのキャンセルを許可するようにthis質問で提案されて

アップデート2:

デリゲートはFBRequestが終了する前に、あなたは基本的にマットを示唆するものである(デリゲートの割り当てを解除すると、アクティブFBRequestの接続を解除する必要が割り当て解除されます場合はクラッシュを避けるためにリンクされた質問で)。しかし、(これが新しいかどうかはわかりません)、NSURLConnectionプロパティが公開されているので、これをFBRequestに直接行うことができます。だから、あなたはプロパティであなたの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プロパティを解放してnilする必要があります。

+1

これについての[未解決の問題](https://github.com/facebook/facebook-ios-sdk/issues/220)があります。 – albertamg

+0

@ user1526896によるコメント:アプリケーションのクラッシュを防ぐには、myRequest.delegate = nil;を追加する必要があります。 – Damon

関連する問題