2016-02-05 29 views
2

如何在访问facebookData变量之前让所有函数等待一会儿?由于网络调用是异步的,因此facebookData在从Facebook获取值之前正在被访问。从Facebook获取值FBSDK iOS 4.x(带Swift)?

请从信息中找到以下代码。

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

回答

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变量设置为一个值;从class facebookUserSignUpLogIn调用功能checkUserExistsOrNot()以进行进一步的操作。