【问题标题】:Block in a loop for paging在循环中阻塞以进行分页
【发布时间】:2012-09-01 07:06:12
【问题描述】:

通过以下代码,我尝试通过分页读取 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];
                 }
     ];
}

我的问题是,该块运行你的时间,但不是在每个循环周期。该块在 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];
}

【问题讨论】:

  • 我希望任何采用成功或失败块的东西都可以异步执行它们。 getUserMedia:count:minId:maxId:success:failure: 的实现是什么样的?
  • @CarlVeazey 我正在尝试使用 Instagram 包装器 [链接] (github.com/stuartkhall/instagram),并在上面发布了 getUserMedia 的实现。谢谢!

标签: objective-c block instagram


【解决方案1】:

您传递给此方法的块是异步执行的。客户端发起异步网络请求,调用该方法后立即返回。一旦网络请求成功或失败,您传递给它的块之一就会被调用。这几乎是任何将块用于此类回调的 API 的标准行为。

关于nextID 之类的,我不完全确定你在块内尝试做什么,但你需要知道这一点:1)块不会在循环中运行,2)它们不会以任何保证的顺序运行。因此,无论您要解决什么问题,都需要牢记这一点。

希望这会有所帮助,如果您有任何问题,请告诉我。

【讨论】:

  • 谢谢@CarlVeazey!我想做的是,用分页阅读网页内容。 Instagram API 仅返回一组数据(例如用户媒体),对于下一组数据,您需要使用新的 url (nextid) 调用 API。我真的是 Objective-C 的新手,我现在不知道如何处理这种情况。你知道用分页加载网页内容的正确方法吗?只要此值不为空,就意味着使用新的 nextid 循环?非常感谢!
  • 您是否正在尝试执行某种无休止的滚动操作,在用户滚动到列表末尾附近时加载其他页面或其他内容? [Globals sharedGlobalData].nextMaxId 还会自动增加值吗?虽然,看起来数据将加载到 maxID,因为您传递了 -1...如果您正在对数据进行分页,您可能还希望跟踪下限而不是获取您不需要的信息。但我认为您的 UI 要求可能会决定您的方法。
  • 谢谢@CarlVeazey!这个想法是通过所有页面完全加载数据并将所有相关数据提取(JSON)到一个数组中以供进一步处理。全局变量[Globals sharedGlobalData].nextMaxId存储了从每个页面提取的nextid的值,并传递给下一个url请求。有了这个值(nextid),我就可以加载下一组数据。目前,我正在测试一些方法来循环浏览网站,并在每个循环中传递一个新的 url。你知道另一种方法吗?
  • 抱歉,回复时间有点长。由于每个请求都依赖于获取下一个 ID,因此您应该使用调用此客户端方法的 NSOperationQueueNSOperation 子类。然后定义操作之间的依赖关系,这样一个操作在其所有前辈都具有之前不会执行(理论上应该具有正确的下一个 ID。另外 - 在您的代码中,您可能有错字。是否应该将值调用到 nextID 的客户端方法中和 MaxID 被切换?我想我们想要下一个 ID 的最小值,并且对最大值没有限制。
  • 当然,还有其他方法可以做到这一点——在回调之后使用完成块链接回调也很有效。最后,我不知道 API 会告诉您有关用户的哪些信息,但如果您可以事先知道他们的媒体数量,那么您可能只需发出一个请求,同时为下一个 ID 和最大 ID 传递 -1。如果可能的话,我认为这会比较简单。
猜你喜欢
  • 2018-11-13
  • 2017-12-26
  • 2018-07-09
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
相关资源
最近更新 更多