Facebook graph api 如何使用Swift从相册导入FaceBook个人资料图片

Facebook graph api 如何使用Swift从相册导入FaceBook个人资料图片,facebook-graph-api,swift3,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 = FBSDKGraph

我正在像这样获取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访问个人资料图片,并在我的收藏视图中设置这些图片。我尝试设置图形路径:“我/相册/个人资料图片”,但没有成功。谁能给我一些提示吗

您需要找到
“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
            ]
        }
    }
}
以下是枚举必须遵守的协议和扩展

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()
    }
}

我的回答是这样的:

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,然后再打一个电话获取该相册的照片。这里我从另一个函数内部调用一个函数。如果有人能帮助我以更快捷的方式编写代码,那会很有帮助,比如使用闭包。谢谢

如果您
打印(错误)
可选({data=();})
您确定这是错误还是结果?如果错误==nil{print(“profile pic***************(result)”)},那么它就不是错误了,你是来自天堂的天使:)在这行中遇到了一些麻烦
\u=$0.1.map({handler($0 as!T)})?
,说无法将类型为“\uu NSDictionaryI”(0x1058130b8)的值转换为“NSArray”(0x105812c58),你有时间来修复吗!!对不起,老兄,我太打扰你了!!!仍然存在一些问题,当我运行应用程序时,它崩溃了,并向我显示一些线程问题,如:libswiftCore.dylib`\u swift\u bridgenon-speartimfromobjectivec:。我想它和arrayyes有麻烦了它现在工作了@Callam,我得到了照片的id。非常感谢你的时间和努力,这真的很有帮助。谢谢,这太棒了!非常感谢。你好,Arafin,我得到nil响应作为可选({data=();})在得到相册id后,再次请求得到可选({data=();})空数组的照片列表