0

私はいくつかの問題を引き起こしている方法を持っています。2 つのメソッドを順番に実行しようとしていますが、最初のメソッドが終了する前に 2 番目のメソッドが開始され続けます。最初の方法にブロックがあるという事実に関係していると確信していますが、よく理解していないため、修正することも、ここで他の回答を利用することさえできませんでした。ヘルプやアドバイスをいただければ幸いです。

トップレベルの方法:

- (IBAction)SendTextTapped:(id)sender{
  NSLog(@"Entered tapped method");
  [self setLocation];
  NSLog(@"Supposedly past setLocation");
  [self sendInAppSMS:globalLocation];
  }

最初のヘルパー メソッド:

- (void)setLocation{
  CLLocation *location = locationManager.location;
  CLGeocoder *geocoder = [[CLGeocoder alloc] init];
  CLLocation *newerLocation =[[CLLocation alloc]initWithLatitude:location.coordinate.latitude
                                                       longitude:location.coordinate.longitude];
  NSLog(@"%f",location.coordinate.longitude);
  [geocoder reverseGeocodeLocation:newerLocation completionHandler:^(NSArray *placemarks, NSError *error) {
    if (error) {
      NSLog(@"Geocode failed with error: %@", error);
      return;
    }
    //NSLog(@"Entered geocoder");

    if (placemarks && placemarks.count > 0) {
      CLPlacemark *placemark = placemarks[0];

      NSDictionary *addressDictionary =
      placemark.addressDictionary;

      NSLog(@"%@ ", addressDictionary);
      NSString *address = [addressDictionary objectForKey:(NSString *)kABPersonAddressStreetKey];
      globalLocation=[NSString stringWithFormat:@"pickup: %@, %@\n person: Joe Blow", address,placemark.subLocality];
      NSLog(globalLocation);
      dispatch_async(dispatch_get_main_queue(), ^{});
    }
  }];

}

2 番目のヘルパー メソッド:

-(void) sendInAppSMS:(NSString *)message
{
  NSLog(@"Entered sendInAppSMS");
    MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init];
    if([MFMessageComposeViewController canSendText])
    {
        controller.body = message;
        controller.recipients = [NSArray arrayWithObjects:@"123456", nil];
        controller.messageComposeDelegate = self;
        [self presentViewController:controller animated:YES completion:nil];
    }
}

すべてのコードが 1 つのメソッドにある場合はすべて正常に機能しますが、プロジェクトを続行するには、アクションを分離できる必要があります。

あなたが与えることができるどんな助けにも感謝します!

4

1 に答える 1

0

次のように呼び出す必要があります。

[self setLocationWithCompletionHandler:^(NSString *message) {
    [self sendInAppSMS:message];
}];

メソッドを次のように変換します。

- (void)setLocationCompletionHandler:(void (^)(NSString *message))completionHandler{
    ....
    dispatch_async(dispatch_get_main_queue(), ^{
        if (completionHandler) completionHandler(globalLocation);
    });
}
于 2013-03-14T13:07:45.580 に答える