UITableView花费大量时间来绑定数据

时间:2014-11-26 14:36:13

标签: ios objective-c xcode

我正在使用UITableView,在调用Web服务后,我正在创建单元格和绑定数据。 Web服务获取数据的速度非常快,但我检查了它需要时间将单元格绑定到UITableView。我的代码是 -

.m文件

#pragma mark tableViewDelegate Methods
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
   return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  //return ([team1Arr count]+1);
  if (isFiltered) {
    return [filteredMySquareArr count];
  }
  else
    return [mySquareArr count];
} 
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *cellIdentifier = @"Cell";
  UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:nil];
  if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
  }
 // dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    dispatch_async(dispatch_get_main_queue(), ^{
  UILabel *squareNameLbl = [[UILabel alloc] initWithFrame:CGRectMake(25.0, 7.0, 300, 25)];
  [squareNameLbl setFont:[UIFont systemFontOfSize:15]];
  UILabel *descLbl = [[UILabel alloc]initWithFrame:CGRectMake(25.0, 32.0, 285.0, 13.0)];
  [descLbl setFont:[UIFont systemFontOfSize:12]];
  descLbl.textColor = [UIColor colorWithRed:72.0f/255 green:180.0f/255 blue:71.0f/255 alpha:1.0f];
  UIImageView *lockImage = [[UIImageView alloc] initWithFrame:CGRectMake(10, 15, 10, 10)];
  NSString *accessTypeStr;
  if (isFiltered) {
    //cell.textLabel.text = [filteredMySquareArr objectAtIndex:indexPath.row];
    squareNameLbl.text = [filteredMySquareArr objectAtIndex:indexPath.row];
    descLbl.text =[NSString stringWithFormat:@"Located within %.2f miles",   [[filteredMySquareDescArr objectAtIndex:indexPath.row] doubleValue]];
    accessTypeStr = [NSString stringWithFormat:@"%@",[filteredAccessTypeArr objectAtIndex:indexPath.row]];
    if ([accessTypeStr isEqualToString:@"private"]) {
        lockImage.image = [UIImage imageNamed:@"lock.png"];
    }
 }
 else
 {
    //cell.textLabel.text = [mySquareArr objectAtIndex:indexPath.row];
    squareNameLbl.text = [mySquareArr objectAtIndex:indexPath.row];
    descLbl.text =[NSString stringWithFormat:@"Located within %.2f miles",[[mySquareDescArr objectAtIndex:indexPath.row] doubleValue]];
    accessTypeStr = [NSString stringWithFormat:@"%@",[accessTypeArr objectAtIndex:indexPath.row]];
    if ([accessTypeStr isEqualToString:@"private"]) {
        lockImage.image = [UIImage imageNamed:@"lock.png"];
    }

}
cell.backgroundColor = [UIColor clearColor];
[cell addSubview:squareNameLbl];
[cell addSubview:descLbl];
[cell addSubview:lockImage];

UIImageView *image = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 10, 20)];
[image setImage:[UIImage imageNamed:@"arrow_list.png"]];
cell.accessoryView = [[UIImageView alloc]initWithFrame:CGRectMake(260.0, 7.0, 10, 20)];
[cell.accessoryView addSubview:image];
});
 // });
 //cell.accessoryView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"arrow_list.png"]];
  return cell;
 }

的WebService

#pragma mark - Webservice Methods
-(void)fetchUpcomingSquares
{
  NSString *post = [NSString stringWithFormat:@"access_token=%@&page=0",globalAccessToken];
  NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
  NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]];
  NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
  [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@upcoming_squares",GLOBALURLDOMAIN]]];
  [request setHTTPMethod:@"POST"];
  [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
  [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
  [request setHTTPBody:postData];

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSURLResponse *response;
    NSError *error =nil;

   NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
   NSLog(@"responsedata =%@",responseData);
    if(error)
    {
        if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
            NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
            NSLog(@"HTTP Error: %d %@", httpResponse.statusCode, error);
            return;
        }
        NSLog(@"Error %@", error);
        [hud hide:YES];
        return;
    }
   if (responseData == NULL) {
      AppDelegate *appdel = [[UIApplication sharedApplication]delegate];
      [hud hide:YES];
      [appdel alertError];
   }
   else
   {
      NSDictionary *parsingResultLogin = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:nil];
    NSLog(@"parsingResultLogin = %@",parsingResultLogin);

      if ([@"-1" isEqualToString:[[parsingResultLogin objectForKey:@"result"]objectForKey:@"error_code"]]) {
        NSLog(@"%@",[[parsingResultLogin objectForKey:@"result"]objectForKey:@"error_message"]);
        [self showAlertWithMessage:[NSString stringWithFormat:@"%@",[[parsingResultLogin objectForKey:@"result"]objectForKey:@"error_message"]]];
        [hud hide:YES];
    }
    else
    {
        NSLog(@"Valid ID");

         NSDictionary *result= [parsingResultLogin objectForKey:@"result"];
        //NSLog(@"result = %@", result);

        squareList = [result objectForKey:@"squares"];
        NSLog(@"squareList = %@", squareList);

        for (NSDictionary *sq in squareList) {
            [mySquareArr addObject:[sq objectForKey:@"square_name"]];
            [mySquareDescArr addObject:[sq objectForKey:@"max_distance"]];
            [accessTypeArr addObject:[sq objectForKey:@"access_type"]];
        }
        [self.mySquareTblView reloadData];
        [hud hide:YES];
    }
  }
  });
  NSLog(@"access Type =%@",accessTypeArr);

}

2 个答案:

答案 0 :(得分:0)

我认为很清楚。您没有在此行代码中使用您的单元格标识符:

UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:nil];

你应该这样做:

UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

答案 1 :(得分:0)

我使用了以下代码并且工作正常

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];