2011-01-20 20 views
9

Bir Facebook nesnesinin bekleyen isteğini iptal etmek için bir yol var mı?iPhone Facebook SDK'nin Facebook sınıfında iptal yöntemi var mı?

Facebook.h'da ya da dayanan NSURLConnection nesnesine erişme yolu olarak herhangi bir yöntem bulamıyorum. Gezinme çubuğunda geri basar ve bekleyen bir asenkronize Facebook isteği ise, yanıt geldikten sonra, uygulamanın çökmesine neden olan bir iletilen bir view mesajını göndermeye çalışır.

cevap

7

olarak bu soruya Tim'in yanıtında işaret DÜZENLEME, bu bilgiler Facebook iOS SDK en yeni sürümleriyle artık geçersiz olabilir.

Bekleyen bir isteği iptal etme yolu yoktur. Ancak, bu, uygulamanızı kilitlememelidir.

Facebook sınıfı, tüm REST veya Graph API isteklerini yapmak için kapağın altında FBRequest sınıfını kullanır ve bu, temsilci özelliğiniz olarak görünümünüze (denetleyici?) Bir başvuruyla biten sınıftır. FBRequest için başlığındaki baktığımızda:

mülkiyet bildiriminde atama nitelik o FBRequest.m sonra ancak, bu sınıfa zayıf-ref depolayan görünüyor yapar
@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; 
} 

It Delegeyi açıkça korur. Böylece, uygulamanızın normal akışında, görüntü kontrol cihazınızın navigasyon yığınından atıldıktan sonra ayrılması gerektiğini düşündüğünüzde, FBRequest, cevabın sahipliğini alarak yanıtı almaya devam etmesini sağladı.

Bu, uygulamanın başka bir yerinde başka bellek yönetimi sorunlarınız olabileceği anlamına geliyor.

+0

Teşekkürler, Günümü kurtardın. –

9

Bu soruyla karşılaşan herkes, Matt'in gözleminin en yeni facebook-iphone-sdk için geçerli olmadığını gösteriyor.

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

Yani yetki verilen kişi için bellek yönetimi .h dosyasında geri mülkiyet beyanı düşüyor: parametreleri artık açıkça alakalı yöntemde korunur

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

Bu çarpışma şimdi olduğu anlamına gelir Temsilci nesnesi, FBRequest tamamlanmadan önce ayrılabildiğinden mümkündür.

Güncelleme: Geçici bir bekleyen FBRequests iptalini sağlamak için this söz konusu sürülmektedir

.

Güncelleme 2:

temsilci FBRequest tamamlanmadan önce, size temelde Matt anlaşılacağı budur (temsilci ayırması gibi aktif FBRequest bağlantısını iptal gerekir ayırmanın alır durumunda bir çarpışma önlemek için bağlantılı soruda). Ancak (bunun yeni olup olmadığından emin değilim), bunu doğrudan NSURLConnection özelliğini gösterdiğinden FBRequest'e yapabilirsiniz.bir mülkte sizin FBRequest nesneyi korumak Yani, eğer:

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

Eğer dealloc şeyi temizleyebilir:

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

    ... 

    [super dealloc]; 
} 
istek nesnesi

@property (nonatomic, retain) FBRequest *myRequest; 

ve kaydedin Eğer aradığınız zaman

Açıkçası, yanıtı işledikten sonra muhtemelen FBEquest özelliğini de delege yöntemlerinde serbest bırakmanız ve sıfırlamanız gerekir.

+1

Bu konuda bir [açık sorun] (https://github.com/facebook/facebook-ios-sdk/issues/220) var. – albertamg

+0

@ user1526896 tarafından yorum: Bir uygulama çökmesini önlemek için '' myRequest.delegate = nil; 'eklemeniz gerekiyor. – Damon

İlgili konular