1

データベースに関連付けられたUITableViewでいくつかのスポットを表示しようとしています。NSFetchedResultsController

問題は、特定の場所からの距離(無線)で結果をフィルタリングする必要があることです。距離を計算することはできないと読んだNSPredicateので、座標との単純な比較で、ロケーション周辺のすべてのスポットを取得しています。それは私に場所の周りの正方形を与えます。次に、の結果を繰り返し、fetchedObjectsゾーンにないものを削除します。

- (NSFetchedResultsController *)newFetchedResultsControllerWithSearch:(NSString *)searchString{


NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                                            managedObjectContext:self.managedObjectContext
                                                                                              sectionNameKeyPath:sectionName
                                                                                                       cacheName:@"Stores"];
aFetchedResultsController.delegate = self;

NSError *error = nil;
if (![aFetchedResultsController performFetch:&error])
{
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

// ITERATE FETCHED OBJECTS TO FILTER BY RADIO


int n = [aFetchedResultsController.fetchedObjects count];
NSLog(@"Square result count: %i",n);

self.footerLabel.text = [NSString stringWithFormat:NSLocalizedString(@"%i Spots", @"%i Spots"),n];

return aFetchedResultsController;

aFetchedResultsControllerオブジェクトを返す前に.fetchedObjectsからオブジェクトを削除するにはどうすればよいですか?UITableViewそれはのように使用される方法を変更し[fetchedResultsController objectAtIndexPath:indexPath]ますか?

ありがとう

4

5 に答える 5

2

フェッチされた結果コントローラー(FRC)の結果セットを変更することはできません。結果をフィルタリングすることはできますが、FRCがテーブルビューのデータソースとして使用されている場合は役に立ちません。

可能な解決策:

  • 現在の場所までの距離を事前に計算し、その距離を永続的な属性としてデータベースに保存します。次に、FRCのフェッチ要求で直接距離のフィルターを使用できます。もちろん、大きな欠点は、現在の場所が変更されたときに距離を再計算する必要があることです。

  • フェッチされた結果コントローラーは使用しないでください。フェッチ要求を実行し、半径に従ってフェッチ要求の結果を配列にフィルター処理し、この配列をテーブルビューのデータソースとして使用します。ここでの大きな欠点は、FRCの自動更新機能が失われることです。半径またはその他の検索パラメータが変更されるたびに、テーブルビューをリロードする必要があります。

どちらのソリューションも満足のいくものではないことは知っていますが、フェッチされた結果コントローラーを関数ベースのフィルターと組み合わせる方法はないと思います。

于 2013-01-15T08:17:35.110 に答える
0

これを行う適切な方法は、述語を含む新しいフェッチ要求を設定することです。フェッチされた結果コントローラーfetchRequestは読み取り専用であるため、フェッチされた結果コントローラー自体の遅延初期化にロジックを配置する必要があります。

if (searchIsActive) {
   fetchRequest.predicate = 
       [NSPredicate predicateWithFormat:
          @"(%K < %@ && %K > %@) && (%K < %@ && %K > %@)",
          @"lat", @(locationLat + limit), @"lat", @(locationLat - limit),
          @"lon", @(locationLon + limit), @"lon", @(locationLon - limit)];
}
else { fetchRequest.predicate = nil; }

次に、テーブルを更新するには、コントローラーをnilに設定してリロードします。

self.fetchedResultsController = nil;
[self.tableView reloadData];
于 2013-01-15T07:45:53.697 に答える
0

fetchedResultControllerを使用します

NSError *error;

    if (filter) { // check if you need to filter
        // set predicate to self.fetchedResultController.fetchRequest
        self.fetchedResultController.fetchRequest.predicate = [NSPredicate predicateWithFormat:@"your filter params"]];
    }else{ 
        // if you dont need to filter and you need to show all objects set predicate to nil
        self.fetchedResultController.fetchRequest.predicate = nil;
    }

    // and perform fetch!
    if (![self.fetchedResultController performFetch:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    }

後にUIを更新することを忘れないでくださいperFormFetch

于 2015-11-05T17:03:19.923 に答える
0

ジオハッシュ。

つまり、「like」SQLクエリを実行して、ある領域で結果を取得できる場所を含む文字列です。

ウィキペディアから「ジオハッシュは、Gustavo Niemeyerによって発明され、パブリックドメインに配置されたジオコーディングシステムです。これは、空間をグリッド形状のバケットに分割する階層的な空間データ構造であり、Z-として知られているものの多くのアプリケーションの1つです。順序曲線、および一般的に空間充填曲線。

ジオハッシュは、任意精度や、コードの末尾から文字を徐々に削除してサイズを縮小する(そして徐々に精度を失う)可能性な​​どのプロパティを提供します。

徐々に精度が低下する結果として、近くの場所はしばしば(常にではありませんが)同様のプレフィックスを提示します。共有プレフィックスが長いほど、2つの場所は近くなります。」

于 2016-10-06T20:13:41.487 に答える
-1

NSPredicateを使用して、配列を検索/フィルタリングします。

例:

NSString *modelName = @"honda";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"model == %@", modelName];
NSArray *filteredArray = [results filteredArrayUsingPredicate:predicate];
于 2013-01-15T06:57:35.537 に答える