Не удается создать несколько запросов FBSDKGraphRequests

#ios #swift #facebook #facebook-ios-sdk

#iOS #swift #Facebook #facebook-ios-sdk

Вопрос:

Я пытаюсь прочитать сообщения со страницы Facebook, используя следующий код:

 class FacebookGraphAPI {
    class func getPosts(fromPageWithID pageId: String, parameters: [String: AnyObject]?, completion: @escaping ([FacebookPost]?, Error?) -> Void) {
        self.getAccessToken { (accessToken, error) in
            if error != nil {
                completion(nil, error)
                return
            }

            let params = ["access_token": accessToken, "fields": "created_time,message,story"]

            if let request = FBSDKGraphRequest(graphPath: "(pageId)/posts", parameters: params) {
                request.start { (connection, result, error) in
                    if error != nil {
                        completion(nil, error)
                        return
                    }

                    guard let resultDict = result as? [String: AnyObject],
                        let data = resultDict["data"] as? NSArray
                        else {
                        completion(nil, nil)
                        return
                    }

                    var posts = [FacebookPost]()

                    for item in data {
                        posts.append(FacebookPost(dict: item as! NSDictionary))
                    }

                    completion(posts, nil)
                }
            }

            completion(nil, nil)
        }
    }

    class func getAccessToken(completion: @escaping (String?, Error?) -> Void) {

        let clientId = Bundle.main.object(forInfoDictionaryKey: "FacebookAppID") as! String
        let clientSecret = Bundle.main.object(forInfoDictionaryKey: "FacebookAppSecret") as! String

        let params = ["client_id": clientId, "client_secret": clientSecret, "grant_type": "client_credentials", "fields": "access_token"]

        if let request = FBSDKGraphRequest(graphPath: "oauth/access_token", parameters: params) {
            request.start(completionHandler: { (connection, result, error) in
                if error != nil {
                    completion(nil, error)
                    return
                }

                guard let resultDict = result as? [String: AnyObject] else {
                    completion(nil, nil)
                    return
                }

                let accessToken = resultDict["access_token"] as! String
                completion(accessToken, nil)
            })
        }
    }
}
  

Который я затем вызываю, используя, например, следующее:

 FacebookGraphAPI.getPosts(fromPageWithID: "{page-id}", parameters: ["limit": 5 as AnyObject]) { (posts, error) in
    guard error == nil else { return }

    ...
}
  

Ошибка, которую я получаю, такова: -[_SwiftValue length]: unrecognized selector sent to instance при запуске второго запроса FBSDKGraphRequest.

Я попытался удалить первый запрос FBSDKGraphRequest, а затем я, по крайней мере, получаю ответ в completionHandler. Кажется, что я не могу выполнить более одного запроса FBSDKGraphRequest.

Любая помощь приветствуется.

Заранее спасибо!

Комментарии:

1. Можете ли вы успешно сгенерировать токен доступа из первого запроса Graph?

2. Да, без каких-либо проблем

3. Хм, внезапно я не получаю никакого ответа при попытке получить токен доступа

4. Упс, я по ошибке вызвал свой метод внутри асинхронного блока DispatchQueue. Теперь я могу снова успешно получить токен доступа

Ответ №1:

Мне наконец удалось найти проблему, когда я подумал об ошибке и вспомнил, что фреймворк FBSDKCoreKit был написан на Objective-C.

Все, что мне нужно было сделать, это привести accessToken внутри массива параметров к NSString .

Я изменил следующее:

 let params = ["access_token": accessToken, "fields": "created_time,message,story"]
  

Для:

 let params = ["access_token": accessToken! as NSString, "fields": "created_time,message,story"]