有人可以帮助我按距离排序我的数组并在TableView中显示它吗?我创建了一个属性“sortedArray”并合成。我创建了一个“sortList”方法,并在didUpdateToLocation下调用它。但是它似乎没有对数组进行排序,或者我没有将更新的结果存入我的TableView。
@property(nonatomic, strong) NSArray *sortedArray;
-(NSArray *) sortList;
-(NSMutableArray *) barList;
@synthesize sortedArray;
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
currentLoc = newLocation;
if (newLocation.horizontalAccuracy <= 100.0f) {
[locMgr stopUpdatingLocation];
}
NSLog(@"Lat: %f, Long: %f", currentLoc.coordinate.latitude, currentLoc.coordinate.longitude);
[self barList];
[self sortList];
[self.tableView reloadData];
}
-(NSMutableArray *) barList{
theauthors = [[NSMutableArray alloc] init];
@try {
NSFileManager *fileMgr = [NSFileManager defaultManager];
NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"TulsaBars.sqlite"];
BOOL success = [fileMgr fileExistsAtPath:dbPath];
if(!success)
{
NSLog(@"Cannot locate database file '%@'.", dbPath);
}
if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK))
{
NSLog(@"An error has occured: %@", sqlite3_errmsg(db));
}
const char *sql = "SELECT * FROM TulsaBars";
sqlite3_stmt *sqlStatement;
if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK)
{
NSLog(@"Problem with prepare statement: %@", sqlite3_errmsg(db));
}else{
while (sqlite3_step(sqlStatement)==SQLITE_ROW) {
Author * author = [[Author alloc] init];
author.barName = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,1)];
author.barAddress = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,2)];
author.barState = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 5)];
author.barLat = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 8)];
author.barLong = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 9)];
if (currentLoc == nil) {
NSLog(@"current location is nil %@", currentLoc);
}else{
CLLocation *barLocation = [[CLLocation alloc] initWithLatitude:[author.barLat doubleValue] longitude:[author.barLong doubleValue]];
CLLocationDistance distancekm = [currentLoc distanceFromLocation: barLocation]/1000;
NSString *distanceString = [[NSString alloc] initWithFormat: @"%f", distancekm];
author.cachedDist = distanceString;
[theauthors addObject:author];
}
}
}
sqlite3_finalize(sqlStatement);
}
@catch (NSException *exception) {
NSLog(@"Problem with prepare statement: %@", sqlite3_errmsg(db));
}
@finally {
sqlite3_close(db);
return theauthors;
}
}
-(NSArray *) sortList{
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"cachedDist" ascending:YES];
sortedArray = [theauthors sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];
return sortedArray;
}
答案 0 :(得分:0)
嗯...你的-sortList
方法没有进行就地排序,它会返回一个排序的数组,你要扔掉它。
实际上,您的 -barList
方法也是如此。
编辑:这不太正确。 -barList
实际上反复覆盖了一个伊娃,但目前尚不清楚这是否是故意的。
这样做的结果是:
[self barList];
[self sortList];
除了旋转一些CPU周期之外什么都不做 - 你没有对他们的返回值做任何事情!
编辑:好的,我看到你的排序是(巧妙地)设置一个ivar,但它很混乱,因为它也返回一个排序的数组。见下面的评论。
(这看起来像是一种过于复杂的地理数据排序方式,但我现在不打算浏览所有代码。在查看之前需要先解决上述问题。)