大佬教程收集整理的这篇文章主要介绍了ios – 使用FacebookSDK从异步块返回值的方法,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
self.friends = [FacebookWrapper myFriends]; [self.tableView reloadData];
+ (NSArray *)myFriends { __block NSArray *friends = nil; [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *session,FBSessionState status,NSError *error) { if(FB_ISSESSIONOPENWITHSTATE(status)) { [FBrequestConnection startForMyFriendsWithCompletionHandler:^(FBrequestConnection *connection,id data,NSError *error) { CFRunLoopStop(CFRunLoopGetCurrent()); if(error) { return; } NSArray *friendsData = (NSArray *)[data data]; NSMutableArray *fbFriends = [NSMutableArray array]; for(id friendData in friendsData) { Friend *friend = [Friend friendWithDictionary:friendData]; fbFriends addObject:friend]; } friends = [NSArray arrayWithArray:fbFriends]; }]; CFRunLoopRun(); } }]; return friends; }
问题是openActiveSessionWithReadPermissions和startForMyFriendsWithCompletionHandler是异步块,因此该方法在块完成其任务之前返回.
任何帮助将非常感激.
为了说明 – 您可以将“myFriends”方法重新定义为:
(void)myFriendsWithCompletionBlock:(void(^)(NSArray * friends))completionBlock;
然后在执行中,在friends = [NSArray arrayWithArray:fbFriends]之后;你会加上这个:
if (completionBlock != nil) { completionBlock(friends); }
…并在结尾处删除return语句.
最后,在您的视图控制器(或使用该方法的任何对象)上,您将执行以下操作:
[FacebookWrapper myFriendsWithCompletionBlock:^(NSArray *friends){ // do what you need to do with the friends array }];
当然,这仍然是异步的 – 但是没有办法解决Facebook SDK的构建方式(而且,公平地说,这可能是最好的方法 – 等待完成同步的请求会很糟糕!)
编辑:我注意到你也从包装器方法返回,以防它失败;在那种情况下,而不是返回你会做这样的事情:
if (completionBlock != nil) { completionBlock(nil); }
这将导致在调用完成块时,friends数组为nil – 然后您可以在那里处理该错误,但这对您来说是合适的.
希望这有帮助!
以上是大佬教程为你收集整理的ios – 使用FacebookSDK从异步块返回值的方法全部内容,希望文章能够帮你解决ios – 使用FacebookSDK从异步块返回值的方法所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。