self.frIEnds = [FacebookWrapper myFrIEnds];[self.tableVIEw reloadData];
我的包装器myFrIEnds方法看起来应该是这样的
+ (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从异步块返回值的方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)