2

facebookData 変数にアクセスする前に、すべての関数を少し待機させるにはどうすればよいですか? ネットワーク呼び出しは非同期であるため、Facebook から値を取得する前に facebookData にアクセスしています。

情報から以下のコードを見つけてください。

func graphRequestToReturnUserData(graphParameters: Dictionary<String, String>) {

        let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: graphParameters)
        graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in
            if ((error) != nil) {
                print("Error: \(error.localizedDescription)") /*Error Handling*/
            }else {
                self.facebookData = result as! NSDictionary
            }
        })
    }

このような関数を呼び出したくありません:-

   if ((error) != nil) {
                        print("Error: \(error.localizedDescription)") /*Error Handling*/
                    }else {
                        self.facebookData = result as! NSDictionary
    self.printFacebookData()
                    }
                })
             }

func printFacebookData() {
    print(self.facebookData)
    }
4

1 に答える 1

2

私の状況でうまく機能する解決策を見つけたので、ここに投稿して詳細を読み、さらに改善するためにコメントする可能性があります.

ここでの簡単な解決策は、プロパティ オブザーバーを使用して、プロパティが変更されたらすぐに関数を呼び出すことです。スレッドを台無しにしたり、セマフォを使用したりする必要はありません。

ソリューション コードは次のようになります。

class facebookGraphRequest {

    static var facebookData = NSDictionary()

//Property Observer, willSet-didSet

    var facebookD = NSDictionary() {

        didSet {
            facebookGraphRequest.facebookData = facebookD           //Assigning values to the static class variable
            facebookUserSignUpLogIn().checkUserExistsOrNot()        //Calling a function from the other class
        }
    }


//Mark: GraphRequestForFetchingUserData

    func graphRequestToReturnUserData(graphParameters: Dictionary<String, String>) {
        let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: graphParameters)
        graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in
            if ((error) != nil) {
                print("Error: \(error.localizedDescription)")       //Error Handling
            } else {
                self.facebookD = result as! NSDictionary
            }
        })
    }
}

ここで、最初の部分はプロパティ オブザーバー ( willSet-didSet ) であり、次にユーザー データを取得するための GraphAPI 呼び出しです。すぐにfacebookD変数に値が設定されます。関数は、さらなるアクションcheckUserExistsOrNot()のために から呼び出されます。class facebookUserSignUpLogIn

于 2016-02-09T11:36:29.047 に答える