0

mapkit フレームワークを使用して、近くの場所の配列を取得したいと考えています。したがって、ユーザーがテキストフィールドに入力すると、次の関数が呼び出されます。

- (void)searchForLocations:(NSString *)string
{
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(search:) object:nil];
    [self performSelectorInBackground:@selector(search:) withObject:string];
}

- (void)search :(NSString *)string
{
    MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init];
    request.naturalLanguageQuery = string;
    MKCoordinateRegion region;
    MKCoordinateSpan span;
    span.latitudeDelta = 0.05;
    span.longitudeDelta = 0.05;

    region.span = span;
    region.center = newLocation.coordinate;

    request.region = region;

    MKLocalSearch *search = [[MKLocalSearch alloc]initWithRequest:request];

    [search startWithCompletionHandler:^(MKLocalSearchResponse
                                         *response, NSError *error) {
        if (response.mapItems.count == 0)
        {
            NSLog(@"No Matches");
        }
        else
        {

            NSLog(@"name = %@", item.name);
            NSLog(@"Phone = %@", item.phoneNumber);
        }
    }];
}

ご覧のとおり、新しい入力テキストが来る場合は、以前の検索をキャンセルしたいと考えています。ただし、以前の検索はキャンセルされません。前の検索をキャンセルするにはどうすればよいですか?

前もって感謝します。

4

3 に答える 3

2

MKLocalSearchにはcancelメソッドがあります。あなたはそれを試しましたか?

編集:ああ、すみません、私は愚かでした。古い検索をキャンセルするには、何らかの方法で古い検索への参照を保持する必要があります。検索が終了したときにクリア (つまり、nil に設定) できるプロパティに入れます。検索関数を呼び出すときはいつでも、以前の検索関数をキャンセルして (「if」は必要ありません。nil はすべてを飲み込みます)、新しい検索関数を作成します。

@property (nonatiomic, strong) MKLocalSearch *previousSearch;

- (void)search :(NSString *)string
{
    [self.previousSearch cancel];
    MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init];
    request.naturalLanguageQuery = string;
    MKCoordinateRegion region;
    MKCoordinateSpan span;
    span.latitudeDelta = 0.05;
    span.longitudeDelta = 0.05;

    region.span = span;
    region.center = newLocation.coordinate;

    request.region = region;

    MKLocalSearch *search = [[MKLocalSearch alloc]initWithRequest:request];

    [search startWithCompletionHandler:^(MKLocalSearchResponse
                                     *response, NSError *error) {
        self.previousSearch = nil;
        if (response.mapItems.count == 0)
        {
            NSLog(@"No Matches");
        }
        else
        {

            NSLog(@"name = %@", item.name);
            NSLog(@"Phone = %@", item.phoneNumber);
        }
    }];

    self.previousSearch = search;
}
于 2015-07-30T09:21:55.210 に答える
-1

NSBlockOperation を使用できます。NSBlockOperation に使用したグローバル変数が blockOperation であるとします。それで :

[search startWithCompletionHandler:^(MKLocalSearchResponse
                                     *response, NSError *error) {
    blockOperation = NSBlockOperation(block: { () -> Void in
         if (response.mapItems.count == 0) {
            NSLog(@"No Matches");
         } else {
            NSLog(@"name = %@", item.name);
            NSLog(@"Phone = %@", item.phoneNumber);
         }
    })
}];

次に、この blockOperation を使用して、次のように任意の場所でキャンセルできます。

blockOperation.cancel()
于 2015-07-30T09:25:50.363 に答える