1

次のコードを使用して、ページングを使用して Instagram API コンテンツを読み取ろうとしています。FOR ループでは、メソッド loopData を呼び出して、ループごとに新しいページ ID を持つブロックでコンテンツを取得するつもりです。

...

    for (int a = 1; a <= 3; a++)
    {
       NSLog(@"Loop count: %i", a);

       [self loopData];
    }

-(void)loopData 
{
    NSString *next;
    next = [Globals sharedGlobalData].nextMaxId;

    [client getUserMedia:[userTextField stringValue]
                   count:kCount
                   minId:-1
                   maxId:next
                 success:^(NSArray *media) {
                     [textView setString:[media description]];

                     NSLog(@"Next_Max_Id: %@ ", [Globals sharedGlobalData].nextMaxId);

                 }
                 failure:^(NSError *error, NSInteger statusCode) {
                     [self logError:@"media" error:error statusCode:statusCode];
                 }
     ];
}

私の問題は、ブロックが 3 回実行されることですが、すべてのループ サイクルで実行されるわけではありません。ブロックは for ループが終了した後に実行されます。したがって、新しいページ ID をブロックに渡すことはできません。

ログは次のようになります。 ループ 1 ループ 2 ループ 3

ブロックを介してコンテンツを読み取る ブロックを介してコンテンツを読み取る ブロックを介してコンテンツを読み取る

たくさんのアイデアありがとうございます!!

--- getUserMedia の実装

// Get a user's media
- (void)getUserMedia:(NSString*)userId // Can be 'self' for the current user
               count:(int)count 
               minId:(int)minId // -1 for start
               maxId:(int)maxId // -1 for no upper limit
             success:(void (^)(NSArray* media))success
             failure:(void (^)(NSError* error, NSInteger statusCode))failure {
    // Setup the parameters
    NSMutableDictionary* parameters = [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:count], @"count",  nil];
    if (minId > 0) [parameters setObject:[NSNumber numberWithInt:minId] forKey:@"minId"];
    if (maxId > 0) [parameters setObject:[NSNumber numberWithInt:maxId] forKey:@"maxId"];

    // Fire the get request
    [self getPath:[NSString stringWithFormat:@"users/%@/media/recent", userId]
       modelClass:[InstagramMedia class]
       parameters:parameters
       collection:success
           single:nil
          failure:failure];
}
4

1 に答える 1

0

このメソッドに渡すブロックは非同期で実行されます。クライアントは非同期ネットワーク要求を開始し、このメソッドを呼び出すとすぐに戻ります。ネットワーク リクエストが成功または失敗すると、渡したブロックの 1 つが呼び出されます。これは、このようなコールバックに使用するブロックを取るすべての API の標準的な動作です。

などに関してブロック内で何をしようとしているのか完全にはnextIDわかりませんが、これを知っておく必要があります: 1) ブロックはループ内で実行されず、2) 保証された状態では実行されません。注文。したがって、解決しようとしている問題が何であれ、それを念頭に置く必要があります。

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-09-01T16:17:48.973 に答える