首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对UITableView的数组进行排序

对UITableView的数组进行排序
EN

Stack Overflow用户
提问于 2014-04-01 14:19:15
回答 1查看 110关注 0票数 0

我有一个为我的UITableView准备数据的函数:

代码语言:javascript
复制
- (void) SearchFromMyPosition {

   TitleLabelSort    = [[NSMutableArray alloc] init];
   DistanceLabelSort = [[NSMutableArray alloc] init];
   TagValueSort      = [[NSMutableArray alloc] init];
   DistanceUnitSort  = [[NSMutableArray alloc] init];
   LatArraySort      = [[NSMutableArray alloc] init];
   LngArraySort      = [[NSMutableArray alloc] init];

   // loading
  [activityIndicatorObject startAnimating];

  NSNumber *latNr1 = [[NSUserDefaults standardUserDefaults] valueForKey:@"api_lat"];
  NSNumber *lngNr1 = [[NSUserDefaults standardUserDefaults] valueForKey:@"api_lng"];
  double lat1 = [latNr1 doubleValue];
  double lng1 = [lngNr1 doubleValue];

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSArray *array = [APIConnection GetDataFromUrlAuth];

    dispatch_async(dispatch_get_main_queue(), ^{

        for (NSString *item in array) {

            NSArray *coords = [[[array valueForKey:item] valueForKey:@"location"] componentsSeparatedByString:@"|"];

            double lat2 = [[coords objectAtIndex:0] doubleValue];
            double lng2 = [[coords objectAtIndex:1] doubleValue];

            CLLocation *oldLocation = [[CLLocation alloc] initWithLatitude:lat1 longitude:lng1];
            CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:lat2 longitude:lng2];
            CLLocationDistance meters = [newLocation distanceFromLocation:oldLocation];

            [LatArraySort addObject:[NSString stringWithFormat:@"%f",lat2]];
            [LngArraySort addObject:[NSString stringWithFormat:@"%f",lng2]];
            [TitleLabelSort addObject:[[array valueForKey:item] valueForKey:@"name"]];
            [DistanceLabelSort addObject:[NSString stringWithFormat:@"%f",meters]];
            [TagValueSort addObject:item];

            [self.myTableView reloadData];
            [activityIndicatorObject stopAnimating];
        }

    });
  });
}

这是可行的,但我需要按DistanceLabelSort对结果进行排序,我使用下面的函数对CoreData结果进行排序,效果很好:

代码语言:javascript
复制
- (void) SetTableData {

   TitleLabel    = [[NSMutableArray alloc] init];
   DistanceLabel = [[NSMutableArray alloc] init];
   TagValue      = [[NSMutableArray alloc] init];
   DistanceUnit  = [[NSMutableArray alloc] init];
   LatArray      = [[NSMutableArray alloc] init];
   LngArray      = [[NSMutableArray alloc] init];

   // sorting
   NSArray *sortedArray = [DistanceLabelSort sortedArrayUsingComparator:^(NSString *str1, NSString *str2) {
    return [str1 compare:str2 options:NSNumericSearch];
}];

   NSString *sortIdentStr = [[NSString alloc] init];
   unsigned long sortIdent;

   NSMutableArray *arrayUnit = [[NSMutableArray alloc] init];

   for (int i = 0; i < sortedArray.count; i++) {

    sortIdentStr = [sortedArray objectAtIndex:i];
    sortIdent    = [DistanceLabel indexOfObject:sortIdentStr];

    arrayUnit = [self unitStr:sortIdentStr];

    [TitleLabel addObject:[TitleLabelSort objectAtIndex:sortIdent]];
    [TagValue addObject:[TagValueSort objectAtIndex:sortIdent]];
    [LatArray addObject:[LatArraySort objectAtIndex:sortIdent]];
    [LngArray addObject:[LngArraySort objectAtIndex:sortIdent]];

    [DistanceLabel addObject:[arrayUnit objectAtIndex:0]];
    [DistanceUnit addObject:[arrayUnit objectAtIndex:1]];

    [self.myTableView reloadData];
    [activityIndicatorObject stopAnimating];
   }
}

但是如果我尝试使用它来对来自外部api函数的数据进行排序,那么在我从外部api获得结果之前,SetTableData就已经完成了。

EN

Stack Overflow用户

发布于 2014-04-01 19:47:19

最后我找到了解决方案,也许这会对其他人有帮助:

我添加了检查任务是否完成的功能:

代码语言:javascript
复制
- (void)SearchFromMyPositionWithSuccess:(void (^)(void))successHandler failure:(void (^)(void))failureHandler {

  TitleLabelSort    = [[NSMutableArray alloc] init];
  DistanceLabelSort = [[NSMutableArray alloc] init];
  TagValueSort      = [[NSMutableArray alloc] init];
  DistanceUnitSort  = [[NSMutableArray alloc] init];
  LatArraySort      = [[NSMutableArray alloc] init];
  LngArraySort      = [[NSMutableArray alloc] init];

  // loading
 [activityIndicatorObject startAnimating];

 NSNumber *latNr1 = [[NSUserDefaults standardUserDefaults] valueForKey:@"api_lat"];
 NSNumber *lngNr1 = [[NSUserDefaults standardUserDefaults] valueForKey:@"api_lng"];
 double lat1 = [latNr1 doubleValue];
 double lng1 = [lngNr1 doubleValue];

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

   NSArray *array = [APIConnection GetDataFromUrlAuth];

   dispatch_async(dispatch_get_main_queue(), ^{

    int i = 0;
    for (NSString *item in array) {
        i++;
        NSArray *coords = [[[array valueForKey:item] valueForKey:@"location"] componentsSeparatedByString:@"|"];

        double lat2 = [[coords objectAtIndex:0] doubleValue];
        double lng2 = [[coords objectAtIndex:1] doubleValue];

        CLLocation *oldLocation = [[CLLocation alloc] initWithLatitude:lat1 longitude:lng1];
        CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:lat2 longitude:lng2];
        CLLocationDistance meters = [newLocation distanceFromLocation:oldLocation];

        [LatArraySort addObject:[NSString stringWithFormat:@"%f",lat2]];
        [LngArraySort addObject:[NSString stringWithFormat:@"%f",lng2]];
        [TitleLabelSort addObject:[[array valueForKey:item] valueForKey:@"name"]];
        [DistanceLabelSort addObject:[NSString stringWithFormat:@"%f",meters]];
        [TagValueSort addObject:item];

        if (i == array.count) {
            successHandler();
        }           

        [activityIndicatorObject stopAnimating];
    }

   });
 });
}

并等待此函数成功:

代码语言:javascript
复制
-(void) SearchFromMyPosition {
   [self SearchFromMyPositionWithSuccess: ^{

       [self SetTableData];

       NSLog(@"success");
   } failure:^{
       NSLog(@"failure");
   }];
}

这解决了我的问题:)

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22778249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档