2014-04-01 65 views
0

数组我有我的UITableView准备数据的功能:分拣的UITableView

- (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结果我用下面的功能和正常工作:

- (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函数中排序数据SetTableData是在我从外部api得到结果之前完成的。

+0

http://stackoverflow.com/questions/14541458/how-to-sort按降序排列的日期 –

+0

我认为这个问题不在排序中,而是在任务优先级上。我尝试使用http://stackoverflow.com/questions/11909629/waiting-until-two-async-blocks-are-executed-before-starting-another-block中的解决方案,但函数SetTableData完成了一个块。该块应该先完成。 – Nizzre

回答

0

终于让我找到解决方案,也许这将有利于他人:

我添加函数检查,如果任务完成:

- (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]; 
    } 

    }); 
}); 
} 

,并等待成功在这个函数:

-(void) SearchFromMyPosition { 
    [self SearchFromMyPositionWithSuccess: ^{ 

     [self SetTableData]; 

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

这解决了我的情况:)