0

誰かが私の配列を距離でソートして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;
}
4

1 に答える 1

0

ええと...あなたの-sortListメソッドはインプレースソートを行っていません。ソートされた配列を返していますが、それを捨てています。

実際、同じことがあなたの方法にも当てはまります-barList

編集:これは完全に真実ではありませんでした。 -barList実際には ivar を繰り返し上書きしていますが、これが意図的かどうかは明らかではありません。

これの結果は次のとおりです。

[self barList];
[self sortList];

いくつかの CPU サイクルをスピンするだけです - 戻り値で何もしていません!

編集:わかりました、並べ替えが (微妙に) ivar を設定していることがわかりますが、並べ替えられた配列も返すため、混乱します。以下のコメントを参照してください。

(これもまた、地理データを並べ替えるには非常に複雑な方法のように見えますが、今はすべてのコードを説明するつもりはありません。それを見る前に、上記を修正する必要があります。)

于 2012-07-02T23:26:05.860 に答える