1

Facebook Graph呼び出しを行い、いくつかの項目を配列に追加しようとしています。項目はforループに追加され、配列は正常に見えます。しかし、forループの後、アイテムは消えます。

FacebookSDK3.1でxcode4.5を使用しています。

私は何を取りこぼしたか?

TableViewController.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

__blockブロックオブジェクト内で変更可能にする場合は、宣言にonを追加する必要があると思います(これで一度問題が発生しました)。現在、スコープはブロック内でのみ抑制されています。

ブロック内の変数のスコープの詳細については、このリンクも参照してください。

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

于 2012-12-27T22:42:31.343 に答える
0

完了ブロックはランダムなスレッドで起動されています。ブロックの背後にある考え方は、設定して忘れてしまうことです。これは、その完了ブロックがいつ発火するかを知ることが保証されていないことを意味します。2秒後、2分になる可能性があります。

これを説明するために、2つのブレークポイントを設定します。1つはviewDidLoadメソッドの上部にあり、もう1つは完了ブロック内にあり、コードのステップ実行を開始します。ブロックの外側のブレークポイントがヒットすることがわかります。ステップスルーして完了ブロックに到達するとき、ブロック内に移動することはありません。代わりに、その上に移動して最後のNSLogステートメントに進みます。そのため、元の2つのオブジェクトしか取得できないと思います。プログラムの実行を再開すると、ブロック内のブレークポイントが起動されます。

これは、完了ブロックがその後の不確定な時間にトリガーされ、配列が実際に正常であることを示すのに役立ちます。

于 2012-12-27T23:54:48.450 に答える