Liron Shapira
Liron Shapira

Reputation: 2017

Handling Facebook Graph API result in iOS SDK with Swift

I just want to request data from Facebook's Graph API, e.g. get the current user's basic info.

The Objective-C doc is: https://developers.facebook.com/docs/ios/graph#userinfo

[FBRequestConnection startForMeWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
  if (!error) {

    /* My question: How do I read the contents of "result" in Swift? */

    // Success! Include your code to handle the results here
    NSLog(@"user info: %@", result);
  } else {
    // An error occurred, we need to handle the error
    // See: https://developers.facebook.com/docs/ios/errors   
  }
}];

There's no Swift doc yet, and I'm confused about the "result" parameter whose type is "id".

Upvotes: 5

Views: 6642

Answers (3)

Giovanny Piñeros
Giovanny Piñeros

Reputation: 583

This is a simpler way:

    let params: [NSObject : AnyObject] = ["redirect": false, "height": 800, "width": 800, "type": "large"]
    let pictureRequest = FBSDKGraphRequest(graphPath: "me/picture", parameters: params, HTTPMethod: "GET")
    pictureRequest.startWithCompletionHandler({
        (connection, result, error: NSError!) -> Void in
        if error == nil {
            print("\(result)")


           let dictionary = result as? NSDictionary
           let data = dictionary?.objectForKey("data")
           let urlPic = (data?.objectForKey("url"))! as! String
           print(urlPic)



        } else {
            print("\(error)")
        }
    })

}

Upvotes: 0

vacawama
vacawama

Reputation: 154593

It looks like result contains a dictionary, but it may be nil. In Swift, its type will map to AnyObject?.

So, in Swift, you could do something like:

// Cast result to optional dictionary type
let resultdict = result as? NSDictionary

if resultdict != nil {
    // Extract a value from the dictionary
    let idval = resultdict!["id"] as? String
    if idval != nil {
        println("the id is \(idval!)")
    }
}

This can be simplified a bit:

let resultdict = result as? NSDictionary
if let idvalue = resultdict?["id"] as? String {
    println("the id value is \(idvalue)")
}

Upvotes: 10

Lars Christoffersen
Lars Christoffersen

Reputation: 1739

Just remember it is not a dictionary all the way down, it is combinations of dictionaries and arrays.

FBRequestConnection.startWithGraphPath("me?fields=feed", completionHandler: { (connection, result, error) -> Void in
                if( error == nil){

                    let fbGraphObject = result as FBGraphObject

                    let feed = fbGraphObject.objectForKey("feed") as NSMutableDictionary

                    let data = feed.objectForKey("data") as NSMutableArray

                    let postDescription = data[0].objectForKey("description") as String

                    //println( post )

                    self.fbu.initialUserFeed = feed
                    self.performSegueWithIdentifier("SelectStreams", sender: self)

                }else
                {
                    //TODO Allert to user that something went wrong
                    println(error)
                }

            })

I got confused about this in the beginning

Upvotes: 0

Related Questions