从completionhandler获取数据 - FBRequestConnection

时间:2015-05-15 09:09:18

标签: facebook swift ios8 closures

我发现了很多关于completionHandlers的信息。但是,在这种情况下,我还没有得到如何处理它。也许你可以帮助我。

我正在尝试获取所有Facebook好友的列表并将其存储在一个阵列中。

getFacebookFriends

func getFacebookFriends() -> NSMutableArray
{

    var retFriendIDs:NSMutableArray = []

    FBRequestConnection.startForMyFriendsWithCompletionHandler {
        (connection:FBRequestConnection!, result: AnyObject!, error:NSError!) -> Void in

        if (error == nil){
            var resultdict = result as! NSDictionary
            self.data = resultdict.objectForKey("data") as! NSArray

            var friendIDs:NSMutableArray = []
            for (var i = 0; i < self.data.count; i++) {
                let valueDict : NSDictionary = self.data[i] as! NSDictionary
                let id = valueDict.objectForKey("id") as! String
                friendIDs.addObject(id as String)
            }
            retFriendIDs = friendIDs
        }
    }
    return retFriendIDs
}

由于这是一个completionHandler,我理解返回在块完成之前触发。但是,如何在此函数中实现返回使用列表?

findFacebookFriendsInBackend

func findFacebookFriendsInBackend() -> [AnyObject]{
    println("findFacebookFriendsInBackend")
    var retFriends:[AnyObject] = []

    let fbFriends:NSMutableArray = getFacebookFriends()

    var friendQuery = PFUser.query()
    // look for friends in Parse
    friendQuery!.whereKey("fbId", containedIn: fbFriends as [AnyObject])

    friendQuery!.findObjectsInBackgroundWithBlock{
        (friends, error) -> Void in
        if error == nil {
            retFriends = friends as [AnyObject]!
        }
    }
    return retFriends
}

然后在一个像这样的简单函数中使用它:

iterateOverFriends

func iterateOverFriends(friends:[AnyObject]!){
    for i in friends {
        doSomething(i)
    }
}

致电

iterateOverFriends(findFacebookFriendsInBackend())

1 个答案:

答案 0 :(得分:1)

简短回答:你没有。不可能。使用异步方法,返回时结果不存在。

你必须调整你的想法。

重写此方法:

func findFacebookFriendsInBackend() -> [AnyObject]{

就像这样:

func findFacebookFriendsInBackend(#completion:
  (friendsArray: [AnyObject]) -> ())

在新表单中,它将块作为参数。编写函数,以便在构建朋友数组后调用该块。

新的通话看起来像这样

findFacebookFriendsInBackend()
{
  (friendsArray) -> () in
  iterateOverFriends(friendsArray)
}

(当你有一个以闭包作为最后一个参数的函数时,可以用括号外的闭包来调用它。)

我在this thread中写了一个很长的答案,包括一个工作示例项目。