お世話になります。
こちらのページを参考にswiftでgraph APIを使用して自分のtaggable_friendsを取り出しています。
以下のコードで、問題なく、デバッグエリアに、自分の友達の名前がprint()関数により出せました。
class FriendsListViewController: UIViewController,{ var friendsData:[[String:Any]] = [] //facebookの友達リストの辞書を要素とする配列 (中略) func getFBfriends(){ FBSDKGraphRequest(graphPath: "me/taggable_friends", parameters: ["fields": "id, name, gender, age_range, locale, timezone, updated_time, first_name, last_name, picture.type(large), email"]).start(completionHandler: { (connection, result, error) -> Void in if (error == nil){ let dict:NSDictionary! dict = result as! [String : Any] as NSDictionary! self.friendsData = dict.object(forKey: "data") as! [[String:Any]] var mycount = 0 for friend in self.friendsData{ mycount += 1 print(String(mycount) + " :" + (friend["name"] as! String)) } }else{ print (error!) } }) } }
ところが、どうも不思議なことに、viewcontrollerのメンバ変数として定義したself.friendsDataをViewDidLoadで呼び出そうとしたら、空でした。当然、このgetFBfriends()よりも後で、呼び出しています。以下の状態です。
override func viewDidLoad() { super.viewDidLoad() self.getFBfriends() for friend in self.friendsData{ //ここはfriendsDataが空のため、呼び出されない } }
かなり邪推なのですが、FBSDKGraphRequestの呼び出しの中で行えることには制限があるような気がしているのですが、そうなのでしょうか?つまり、FBSDKGraphRequestの内部で行ったことはその外部には持ち出せない、など。。。
ひょっとするとswiftのとてつもなく基本的なところを見落としている気もしますが、graph APIの制限のような気もしており、自分で解決することが困難となり、質問させていただいた次第です。検索のキーワードだけでも結構ですので何かヒントをいただけますと幸いです。
facebook APIは、cocoa podで以下のとおりインストールし、当該viewcontrollerのswiftファイルで、import FBSDKCoreKit, import FBSDKLoginKitをしております。
pod 'FBSDKCoreKit' pod 'FBSDKShareKit' pod 'FBSDKLoginKit'
swift3, xcode 8.2.1です。
宜しくお願いいたします。
1月2日追記
Kentarou様のコメントで確実に前進しましたが(おそらくエスケープや”同期”などの仕組みが分かっておらず、以前完全にゴールできておりません・・)
以下の助言に基づき、以下のコードにいたしました。
var friendsString:[String] = [] override func viewDidLoad() { super.viewDidLoad() self.getFBfriends{ var mycount = 0 for friend in self.friendsData{ mycount += 1 print(String(mycount) + " in VDL :" + (friend["name"] as! String)) self.friendsString.append(friend["name"] as! String) self.friendsString.append("てすと") } } // self.setupFriends() print("ともだちすとりんぐ = \(friendsString)") } // getFBfriendsメソッド(Kentarou様のご提示のものそのままです) func getFBfriends(resultBlock: @escaping () -> Void) { FBSDKGraphRequest(graphPath: "me/taggable_friends", parameters: ["fields": "id, name, gender, age_range, locale, timezone, updated_time, first_name, last_name, picture.type(large), email"]).start(completionHandler: { (connection, result, error) -> Void in if (error == nil){ let dict:NSDictionary! dict = result as! [String : Any] as NSDictionary! self.friendsData = dict.object(forKey: "data") as! [[String:Any]] var mycount = 0 for friend in self.friendsData { mycount += 1 print(String(mycount) + " :" + (friend["name"] as! String)) } resultBlock() }else{ print (error!) resultBlock() } }) }
結果、非常に不思議ですが、print分ではin VDL部分は表示されるものの、friendsStringは空でした。for friend in self.friendsDataループ内でブレークポイントを設定してデバッグすると確かにfriendsStringに友達の名前が入っているのですが、ループを出た時にリセットされる(?)ようです。
おそらくクリティカルに何らかの理解が欠落しているのだと思いますが、恐縮ながらあと一歩ご助言いただければと存じます。
宜しくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/01 23:38
2017/01/01 23:49
2017/01/02 00:53
2017/01/02 08:50
2017/01/02 23:59