No se puede devolver la salida del cierre usando la API del gráfico -- ios campo con swift campo con None camp Relacionados El problema

Can't return output of closure using graph api


1
vote

problema

Español

Si llamo a este método para obtener una imagen de perfil de Facebook, no funciona, la respuesta se imprime con los datos, pero cuando lo devuelvo su nil, ¿puede alguien ayudarlo?

  func getProfilePicture() -> NSData?{     var response:NSData?      let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"picture.type(large)"])     graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in          if error != nil {             print("login error: (error!.localizedDescription)")             return         }          let json = JSON(result)         let profilePicture = json["picture"]["data"]["url"].stringValue          if let url = NSURL(string: profilePicture) {             if let pictureData = NSData(contentsOfURL: url){                 response = pictureData             }         }      })     print(response)     return response }   
Original en ingles

If I call this method to obtain a Facebook profile picture it does not work, response gets printed with the data but when I return it its nil, can anyone help?

func getProfilePicture() -> NSData?{     var response:NSData?      let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"picture.type(large)"])     graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in          if error != nil {             print("login error: \(error!.localizedDescription)")             return         }          let json = JSON(result)         let profilePicture = json["picture"]["data"]["url"].stringValue          if let url = NSURL(string: profilePicture) {             if let pictureData = NSData(contentsOfURL: url){                 response = pictureData             }         }      })     print(response)     return response } 
        
       
       

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 

La llamada de Facebook está utilizando un bloque completo de ASYNC y su declaración de retorno devolverá NIL antes de que se realice la llamada. Es por eso que también debe usar un bloque de finalización en su método.

Aquí hay un ejemplo Cómo hacer esto:

      func getProfilePicture(completion: (pictureData: NSData?, error: NSError?) -> Void) {      let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"picture.type(large)"])     graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in          var pictureData: NSData?          let json = JSON(result)         let profilePicture = json["picture"]["data"]["url"].stringValue          if let url = NSURL(string: profilePicture) {             pictureData = NSData(contentsOfURL: url)         }          completion(pictureData: pictureData, error: error)     }) }   

Puede llamar a este código como este:

          self.getProfilePicture {(pictureData, error) -> Void in          if error != nil {             print("login error: (error!.localizedDescription)")         }          print(pictureData)     }   
 

The Facebook call is using an async completionblock and your return statement will return nil before the call is done loading. That is why you also should use a completion block in your method.

Here is an example how to do this:

    func getProfilePicture(completion: (pictureData: NSData?, error: NSError?) -> Void) {      let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"picture.type(large)"])     graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in          var pictureData: NSData?          let json = JSON(result)         let profilePicture = json["picture"]["data"]["url"].stringValue          if let url = NSURL(string: profilePicture) {             pictureData = NSData(contentsOfURL: url)         }          completion(pictureData: pictureData, error: error)     }) } 

You can call this code like this:

        self.getProfilePicture {(pictureData, error) -> Void in          if error != nil {             print("login error: \(error!.localizedDescription)")         }          print(pictureData)     } 
 
 

Relacionados problema

4  Ubicación fusionada a veces se detiene  ( Fused location sometimes stops ) 
He estado trabajando en una aplicación que rastrea la posición del usuario. Para esto, he usado el módulo de ubicación de los servicios de Google Play (a.k.a....

2  Servicestack.Dataannotations ¿Definiciones de atributos faltantes?  ( Servicestack dataannotations missing attributes definitions ) 
Estoy tratando de usar los decoradores de atributos de ServicStack desde ServicesEstack.Dataannotations, pero cuando veo el espacio de nombres de Servicestack...

2  ¿Cómo representar una plantilla por nombre?  ( How to render a template by name ) 
Estoy tratando de obtener mi cabeza alrededor de SERVICESTACK AUTO-AUTHOTHED y la nueva API. Agregar dos vistas del mismo nombre en carpetas separadas res...

88  ¿Añadir la versión de Google Play Services al manifiesto de su aplicación?  ( Adding google play services version to your apps manifest ) 
Estoy siguiendo este tutorial: https://developers.google.com / Mapas / Documentación / Android / Inicio # Descripción general sobre cómo agregar Google Maps...

2  Aplicación de Android Daily ** Desinstala **, ¿cómo se calcula a partir de la consola de desarrollador?  ( Android app daily uninstalls how is it calculated from developer console ) 
¿Alguna idea de cómo Android Developer Console Figuras desinstalaciones diarias? Mi corazonada - a través de la falla de ping de GCM El servicio de Googl...

1  Mapas de Android V2 ofrecen servicio de juego  ( Android maps v2 offer play service ) 
Tengo el éxito de los mapas de Android para trabajar API V2, pero luego intenté probar si no tengo servicios de Google Play, se ofrecerá la aplicación para in...

28  ¿Cómo borrar el índice de elasticsearch?  ( How to erase elasticsearch index ) 
My unidad / prueba de integración incluye pruebas para la funcionalidad de búsqueda. Mi idea es tener un índice de búsqueda vacío antes de cada prueba. Po...

0  Marcos rojos sobre los servicios de Google Play Lib en Eclipse  ( Red mark over google play services lib in eclipse ) 
He seguido a las guías de Sereval, copié la carpeta de la biblioteca en mi área de trabajo y luego lo importó en Eclipse, lo he limpiado una docena de veces y...

0  Cómo combinar eficientemente miles de miles de subcadena en una cadena usando elasticsearch [cerrado]  ( How to efficiently match hundred thousands of substring in one string using elas ) 
cerrado . Esta pregunta debe ser más enfocado . Actualmente no está aceptando respuestas. ...

0  El uso de la función de automóviles de MADRICESTACK causa la autogeneración del error fallido WSDL  ( Using servicestack autoquery feature causes autogeneration of wsdl failed error ) 
Cuando habilito la función de autoquirería en el error de MADRICESTACK, obtengo un error [Route("/Data/ApplicationLog")] public class AutoQueryApplicationLog...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos