如何使用Swift

时间:2017-02-12 05:47:28

标签: facebook-graph-api swift3

我正在获取像这样的facebook个人资料图片

   let params = ["height": 300, "width": 300, "redirect": false] as [String : Any]
        let graphRequest = FBSDKGraphRequest(graphPath: "me/picture", parameters: params, httpMethod: "GET")
        let connection = FBSDKGraphRequestConnection()
        connection.add(graphRequest, completionHandler: { (connection, result, error) in
            if error == nil {
                print("profile pic ************\(result)")
            }
        })
        connection.start()

现在我需要从 ablum 访问个人资料图片,并在我的 collectionView 中设置这些图片。我试图设置 graphPath:“me / album / profile_picture”,但没有运气。请问有人给我一些提示吗?

2 个答案:

答案 0 :(得分:3)

您需要找到"Profile Pictures"相册的ID并请求该ID的照片。

Facebook.albums(user: "me").request({ albums in
    albums.first(where: { ($0["name"] as? String) == "Profile Pictures" }).flatMap({
        Facebook.photos(album: $0["id"] as! String).request({ photos in
            print(photos)
        })
    })
})

我在下面创建了一个枚举,以便更轻松地请求图形api路径。

enum Facebook: Graphable {

    case albums(user: String)
    case photos(album: String)

    var path: String {
        switch self {
        case let .albums(uid):
            return "\(uid)/albums"
        case let .photos(aid):
            return "\(aid)/photos"
        }
    }

    var method: String {
        switch self {
        case .albums, .photos:
            return "GET"
        }
    }

    var params: [String : Any] {
        switch self {
        case .albums:
            return [:]
        case .photos:
            return [
                "height": 300,
                "width": 300,
                "redirect": false
            ]
        }
    }
}

这是enum必须符合的协议和扩展。

protocol Graphable {

    var path: String { get }
    var method: String { get}
    var params: [String : Any] { get }
}

extension Graphable {

    typealias JSON = [String:Any]

    func request(_ handler: @escaping ([JSON]!) -> (), failure: @escaping (Error) -> () = { print($0) }) {

        let connection = FBSDKGraphRequestConnection()
        let request = FBSDKGraphRequest(
            graphPath: path,
            parameters: params,
            httpMethod: method
        )

        connection.add(request) {
            _ = $0.1.map ({ handler(($0 as? JSON)?["data"] as? [JSON]) }) ??
                $0.2.map ({ failure($0) })
        }
        connection.start()
    }
}

答案 1 :(得分:0)

我得到了这样的答案:

import FBSDKCoreKit
import SwiftyJSON   

func getFBAlbumID() {

let graphRequest = FBSDKGraphRequest(graphPath: "me/albums", parameters: nil, httpMethod: "GET")
let connection = FBSDKGraphRequestConnection()
connection.add(graphRequest, completionHandler: { (connection, result, error) in
     if error == nil 
            let dictionary = JSON(result)
               // print("albums ID are **************\(dictionary)")
                if let data = dictionary["data"].array {
                    print("data of profilePicture ******* \(data)")

                    if let dict = data.first(where: { ($0["name"].string ) == "Profile Pictures" }) {
                        let id = dict["id"].string
                        print("my desired id : ********* \(id)")
                        self.getFBAlbumPhoto(albumID: id!)
                    }

                }
              }

        })
        connection.start()
}

func getFBAlbumPhoto(albumID: String) {


        let params = [ "height": 300, "width": 300, "redirect": false] as [String : Any]
        let graphRequest = FBSDKGraphRequest(graphPath: "\(albumID)/photos?fields=source", parameters: params, httpMethod: "GET")
        let connection = FBSDKGraphRequestConnection()
        connection.add(graphRequest, completionHandler: { (connection, result, error) in
            if error == nil {
                //print(result)
                let dictionary = JSON(result)
                print("result are **************\(dictionary)")
            }
        })
        connection.start()

 }

在这里,我抓住了我想要的特定专辑的 ID ,然后再打电话来获取该专辑的照片。在这里,我从另一个函数内部调用一个函数。如果有人可以帮助我用更强大的 Swift 方式编写代码,那么就像使用闭包一样。谢谢。