unity fbsdkcorekit ios facebook facebook-graph-api facebook-ios-sdk

fbsdkcorekit - install facebook sdk ios



Facebook API-Cómo cancelar la solicitud de gráficos (9)

En FBRequest.h , he tenido que add _delegate = nil; porque en mi caso, el delegado de solicitud ya no existía (fue descartado) lo que causó un bloqueo.

De vez en cuando necesito cancelar una solicitud de gráfico FaceBook, pero parece que no hay cancelación o método similar en su API para hacerlo. Por el momento, a veces se producen bloqueos ya que el delegado que asigné a la solicitud ha sido desasignado. ¿Hay alguna forma de cancelar una solicitud de gráficos una vez enviada, por favor?


Realice una llamada CURL a esta URL

https://graph.facebook.com/REQUEST_ID?method=delete


Seguí el enfoque de Matt Wilding que figura aquí, que fue muy útil, gracias Matt. Desafortunadamente, no funcionó para mí, así que hice algunos ajustes y ahora funciona ... también este enfoque revisado se mantiene fuera de las clases centrales de Facebook ...

//in .h define an FBRequest property @property (nonatomic, retain) FBRequest * pendingFBRequest; //in .m when making your request, store it in your FBRequest property pendingFBRequest = [facebook requestWithGraphPath:@"me/feed" andParams:params andHttpMethod:@"POST" andDelegate:self]; //create a timer for your timeout pendingFacebookActionTimer = [NSTimer scheduledTimerWithTimeInterval:15.0 target:self selector:@selector(onPendingFacebookActionTimeout) userInfo:nil repeats:NO]; //cancel the action on the timeout''s selector method -(void)onPendingFacebookActionTimeout { [pendingFBRequest.connection cancel]; }


Actualizado el 22 / abril / 2012

Actualizo la versión de Matt con el SDK de iOS más actualizado de Facebook. Mi proyecto está usando ARC, pero incluyo las fuentes de Facebook que no pertenecen a ARC para poder modificar los códigos. (Por supuesto, necesitamos establecer el indicador "-fno-objc-arc" para los archivos fuente de Facebook). La parte difícil es evitar la pérdida de memoria, y creo que lo estoy haciendo correctamente. Pero cuando lo pruebo en el instrumento, aún veo muy poca pérdida de memoria. Afortunadamente, los detalles muestran que no están relacionados con estos códigos, así que solo asumo que están relacionados con el manejo de recursos de la aplicación.

Aquí está el código que implementé:

// Add to Facebook.h - (void)cancelPendingRequest:(FBRequest *)releasingRequest;

Y...

// Add to Facebook.m - (void)cancelPendingRequest:(FBRequest *) releasingRequest{ [releasingRequest.connection cancel]; [releasingRequest removeObserver:self forKeyPath:requestFinishedKeyPath]; [_requests removeObject:releasingRequest]; }

Y en su proyecto que usa FBRequestDelegate

// Declare this member or property to the .h file FBRequest * currentFbRequest; // Declare this method -(void)cancelFBRequest;

Y ...

// In .m file AppDelegate * appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; // prepare your necessary request data and parameter ... currentFbRequest = [appDelegate.facebook requestWithGraphPath:@"/me/photos" andParams:params andHttpMethod:@"POST" andDelegate:self]; // Then in the method where you want to cancel AppDelegate * appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; [appDelegate.facebook cancelPendingRequest:currentFbRequest]; currentFbRequest=nil;


Pruebe esto en lugar de usar NSTimer:

FBRequest *fbRequest = [facebook requestWithGraphPath:@"me" andDelegate:self]; [self performSelector:@selector(fbRequestTimeout:) withObject:fbRequest afterDelay:30]; - (void)fbRequestTimeout:(FBRequest *)fbRequest { [fbRequest.connection cancel]; [fbRequest setDelegate:nil]; }


Para aquellos de nosotros que construimos la biblioteca estática y no podemos acceder a los archivos de implementación, una categoría sería la mejor manera de hacerlo.

Para aquellos de nosotros que no construimos la biblioteca estática, usar una categoría también sería óptimo porque no necesita modificar los archivos existentes.

Aquí está dicha categoría.

// Facebook+Cancel.h #import "Facebook.h" @interface Facebook (Facebook_cancel) - (void)cancelPendingRequest:(FBRequest *)releasingRequest; - (void)cancelAllRequests; @end

Y luego el archivo .m

// Facebook+Cancel.m #import "Facebook+Facebook_cancel.h" @implementation Facebook (Facebook_cancel) - (void)cancelPendingRequest:(FBRequest *)releasingRequest{ [releasingRequest.connection cancel]; if ([_requests containsObject:releasingRequest]) { [_requests removeObject:releasingRequest]; [releasingRequest removeObserver:self forKeyPath:@"state"]; } } - (void)cancelAllRequests { for (FBRequest *req in [_requests mutableCopy]) { [_requests removeObject:req]; [req.connection cancel]; [req removeObserver:self forKeyPath:@"state"]; } } @end

Para quienes usan cualquier otra respuesta, está causando una pérdida de memoria. El SDK de Facebook le advertirá a través de NSLog que no ha eliminado un observador. La cuarta línea en el método cancelAllRequests corrige este problema.


Estaba teniendo un bloqueo con el iOS SDK de Facebook anterior, que era válido en agosto de 2012 cada vez que navegaba a otra vista. Mi solución se basa en la respuesta de @staticfiction:

Se BOOL viewWillDisappear indicador BOOL viewWillDisappear en .h. En -(void) viewWillDisappear: establece el indicador en YES. Restablecer indicador a NO en -(void) viewDidAppear:

//in .h define an FBRequest property @property (nonatomic, retain) FBRequest * pendingFBRequest; /* * Graph API: Search query to get nearby location. */ - (void)apiGraphSearchPlace:(CLLocation *)location { currentAPICall = kAPIGraphSearchPlace; NSString *centerLocation = [[NSString alloc] initWithFormat:@"%f,%f", location.coordinate.latitude, location.coordinate.longitude]; JMYAppDelegate *delegate = (JMYAppDelegate *)[[UIApplication sharedApplication] delegate]; NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"place", @"type", centerLocation, @"center", @"1000", @"distance", nil]; [centerLocation release]; pendingFBRequest = [[delegate facebook] requestWithGraphPath:@"search" andParams:params andDelegate:self]; if (viewWillDisappear) { [pendingFBRequest.connection cancel]; [pendingFBRequest setDelegate:nil]; [self hideActivityIndicator]; } }


Desde SDK 3.1, es muy fácil, como startWithCompletionHandler: devuelve un objeto FBRequestConnection , que tiene un -(void)cancel; método.

Por ejemplo:

// In interface or .h definitions: @property (strong, nonatomic) FBRequest *fBRequest; @property (strong, nonatomic) FBRequestConnection *fbConnection; // when needed in class (params should be set elsewhere, this is just an example): self.fBRequest = [[FBRequest alloc] initWithSession:[FBSession activeSession] graphPath:@"me/photos" parameters:params HTTPMethod:@"POST"]; self.fbConnection = [self.fBRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error){ NSLog(@"Publish complete, error: %d", error.code); }]; // now, to cancel anywhere in the class, just call: [self.fbConnection cancel];


Supongo que estás hablando del proyecto facebook-ios-sdk y de la falta de un método de cancelación en Facebook.h. Me di cuenta de esto también, y finalmente decidí agregar mi propio método de cancelación. Solo para tener en cuenta, el delegado que asigne a la solicitud no debería ser desasignado y luego referenciado, porque la solicitud retiene al delegado. Ver esta pregunta similar . Ahora, si te encuentras realmente necesitando un método de cancelación por alguna otra razón ...

Agregar un método de cancelación:
Las solicitudes de Facebook se realizan de forma opaca. Nunca los ves, y solo escuchas los resultados a través de la clase de Facebook . Bajo el capó, la clase de Facebook hace solicitudes de Graph API con la clase FBRequest (no para uso público). Esta clase es básicamente un delegado de NSURLConnection elegante. Entonces, para cancelar la solicitud, al miembro NSURLConnection solo se le debe indicar que cancel . Agregar este método a FBRequest:

// Add to FBRequest.h - (void)cancel;

Y...

// Add to FBRequest.m - (void)cancel { [_connection cancel]; [_connection release], _connection = nil; }

Ahora, para exponer una interfaz en la clase de Facebook para hacer uso del nuevo método ...

// Add to Facebook.h - (void)cancelPendingRequest;

Y...

// Add to Facebook.m - (void)cancelPendingRequest { [_request cancel]; [_request release], _request = nil; }

Eso es todo al respecto. El método anterior cancelará la solicitud más reciente y nunca volverás a saber de ella.