我发现了很多关于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())
答案 0 :(得分:1)
简短回答:你没有。不可能。使用异步方法,返回时结果不存在。
你必须调整你的想法。
重写此方法:
func findFacebookFriendsInBackend() -> [AnyObject]{
就像这样:
func findFacebookFriendsInBackend(#completion:
(friendsArray: [AnyObject]) -> ())
在新表单中,它将块作为参数。编写函数,以便在构建朋友数组后调用该块。
新的通话看起来像这样
findFacebookFriendsInBackend()
{
(friendsArray) -> () in
iterateOverFriends(friendsArray)
}
(当你有一个以闭包作为最后一个参数的函数时,可以用括号外的闭包来调用它。)
我在this thread中写了一个很长的答案,包括一个工作示例项目。