1

我尝试进行 Facebook Graph 调用并将一些项目添加到数组中。这些项目被添加到一个 for 循环中,并且数组看起来很好。但是在 for 循环之后,这些项目就消失了。

我将 xcode 4.5 与 Facebook SDK 3.1 一起使用。

我错过了什么?

表视图控制器.m

#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&center=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

干杯——杰里克

4

3 回答 3

2

您的项目将添加到图形调用的完成块中。

当您进行 Api 调用时,它会转到服务器并且不会触发完成块,直到 Web 请求与您的结果一起返回。

因此,当您的最后一行命中时,仍在请求 api 调用并且尚未返回。

于 2012-12-27T22:25:18.757 回答
0

您的完成块正在随机线程上触发。块背后的想法是设置它并忘记它。我的意思是,您不能保证知道该完成块何时会触发。可能是 2 秒后,也可能是 2 分钟。

为了说明这一点,设置两个断点:一个在 viewDidLoad 方法的顶部,另一个在完成块内,然后开始单步执行代码。您会看到块外的断点被命中。当您逐步进入完成块时,您不会在块内移动。相反,您直接越过它并进入您的最后一个NSLog语句,这就是为什么您认为您只得到原始的 2 个对象。继续执行您的程序,块内的断点将被触发。

这应该有助于表明完成块在之后的某个不确定时间被触发,并且您的数组实际上很好。

于 2012-12-27T23:54:48.450 回答
0

__block如果你想让它在块对象中可变,我认为你需要在声明中添加(我曾经遇到过一些问题)。现在范围仅在块内被抑制。

另请查看此链接以获取有关块内变量范围的更多信息。

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/Blocks/Articles/bxVariables.html

于 2012-12-27T22:42:31.343 回答