0

我得到一个 self.usersArray ,其中包含 2 个元素的格式:

(
  {
  userCreated = "2012-01-05 12:27:22";
  username = Simulator;
  },
  {
  userCreated = "2013-01-01 14:27:22";
  username = "joey ";
  }
)

这是在一个完成块中获得的,之后我调用另一个方法通过一个帮助器类为这两个用户获取积分:

-(void)getPoints{
    self.usersPointsArray = [[NSMutableArray alloc] init];
    for (NSDictionary *usersDictionary in self.usersArray) {
        [SantiappsHelper fetchPointsForUser:[usersDictionary objectForKey:@"username"] WithCompletionHandler:^(NSArray *points){
            if ([points count] > 0) {
                [self.usersPointsArray addObject:[points objectAtIndex:0]];
            }
        NSLog(@"self.usersPointsArray %@", self.usersPointsArray);
        }];
    }
}

最终的 self.usersPointsArray 日志如下所示:

(
        {
        PUNTOS = 5;
        username = Simulator;
    },
        {
        PUNTOS = 2;
        username = joey;
    }
)

但问题是点调用的结构化方式,self.usersPointsArray 返回两次,每次返回一个附加对象,由于for循环,我知道。

这是 Helper 类方法:

+(void)fetchPointsForUser:(NSString*)usuario WithCompletionHandler:(Handler2)handler{
    NSURL *url = [NSURL URLWithString:@"http://myserver.com/myapp/readpoints.php"];
    NSDictionary *postDict = [NSDictionary dictionaryWithObjectsAndKeys:usuario, @"userNa", nil];

    NSData *postData = [self encodeDictionary:postDict];

    // Create the request
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request setValue:[NSString stringWithFormat:@"%d", postData.length] forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:postData];

    __block NSArray *pointsArray = [[NSArray alloc] init];

    dispatch_async(dispatch_get_main_queue(), ^{
        // Peform the request
        NSURLResponse *response;
        NSError *error = nil;
        NSData *receivedData = [NSURLConnection sendSynchronousRequest:request
                                                     returningResponse:&response
                                                                 error:&error];
        if (error) {
            if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
                NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
                NSLog(@"HTTP Error: %d %@", httpResponse.statusCode, error);
                return;
            }
            return;
        }

        NSString *responseString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];

        pointsArray = [NSJSONSerialization JSONObjectWithData:[responseString dataUsingEncoding:NSASCIIStringEncoding] options:0 error:nil];

        if (handler)
            handler(pointsArray);
    }); 

}

我不能将 self.usersPointsArray 与初始对象一起使用,只能与最终对象一起使用。它不会总是2个元素,我实际上不知道它会是多少。

构造它的方法是什么,以便在 self.usersPointsArray 完成时得到最终调用,然后重新加载我的 tableview?

4

1 回答 1

0

我认为您的问题是标准的消费者-生产者问题。您可以为将要处理的项目数量创建队列计数 (int totalToProcess=self.usersArray.count)。每次完成处理程序被命中时,它都会执行 totalToProcess--。当 totalToProcess 达到 0 时,您已处理队列中的所有元素并且可以刷新表。

如果我正确理解您的问题,我相信这可以解决您的问题。如果没有,希望我能提供更多信息。

于 2013-07-04T04:31:57.950 回答