我尝试进行Facebook Graph调用并将一些项添加到数组中。这些项目在for循环中添加,数组看起来很好。但在for循环之后,物品消失了。
我在Facebook SDK 3.1上使用xcode 4.5。
我错过了什么?
#import "TableViewController.h"
@interface TableViewController ()
@end
@implementation TableViewController {
NSMutableArray *recipes;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
recipes = [NSMutableArray arrayWithObjects:@"Egg Benedict", nil];
[recipes addObject:@"foobar"];
NSLog(@"recipes before FBRquestConnection: %@", recipes);
[FBRequestConnection
startWithGraphPath:@"search?type=place¢er=37.785834,-122.406417"
completionHandler:^(FBRequestConnection *connection,
id result,
NSError *error) {
if (!error) {
for (id item in [result objectForKey:@"data"]) {
[recipes addObject:[item objectForKey:@"name"]];
}
NSLog(@"recipes after for-loop: %@", recipes);
NSLog(@"amount of recipes after for-loop: %u", [recipes count]);
}
}];
NSLog(@"amount of recipes after FBRequestConnection: %u", [recipes count]);
}
2012-12-27 23:09:44.056 barbar[3481:19a03] recipes before FBRquestConnection: (
"Egg Benedict",
foobar
)
2012-12-27 23:09:44.056 barbar[3481:19a03] amount of recipes after FBRequestConnection: 2
2012-12-27 23:09:44.516 barbar[3481:19a03] recipes after for-loop: (
"Egg Benedict",
foobar,
"Union Square, San Francisco",
"Benefit Cosmetics",
"San Francisco | The Official Guide",
"BareMinerals by Bare Escentuals",
"Viator.com",
"Bleacher Report",
"Downtown San Francisco",
"AMC Metreon 16",
"Cheesecake Factory",
SquareTrade,
"Westfield San Francisco Centre",
"Bloomingdale's San Francisco",
"Macy's San Francisco Union Square",
Xoom,
"Parc 55 Hotel",
"Pottery Barn",
"AT&T Park",
Bebo,
Snapfish,
"Hilton San Francisco Union Square",
uTorrent,
"The Westin St. Francis",
TRUSTe,
"Apple Retail Store - San Francisco"
)
2012-12-27 23:09:44.516 barbar[3481:19a03] amount of recipes after for-loop: 26
欢呼 - jerik
答案 0 :(得分:2)
您的项目将添加到图表调用的完成块中。
当您进行Api呼叫时,它会转到服务器,并且在Web请求返回结果之前不会触发完成块。
因此,当您的最后一行命中时,仍会请求api调用并且尚未返回。
答案 1 :(得分:0)
我认为你需要在声明上添加__block
(我有一些问题),如果你想在块对象中使它变得可变。现在,范围仅在块内被抑制。
另请查看此链接,了解有关块内变量范围的更多信息。
答案 2 :(得分:0)
您的完成块正在随机线程上触发。块背后的想法是设置 - 忘记它。通过这个,我的意思是你不能保证知道什么时候完成块会被触发。可能是2秒后,可能是2分钟。
为了说明这一点,设置两个断点:一个位于viewDidLoad方法的顶部,另一个位于完成块内,并开始逐步执行代码。你会看到块外的断点被击中。当您单步执行并到达完成块时,您不会移动到块内。相反,你向右走过它并进入你最后的NSLog
语句,这就是为什么你认为你只得到原来的2个对象。继续执行程序,块内的断点将被触发。
这应该有助于显示完成块在之后的某个不确定时间被触发,并且您的数组实际上是正常的。