0

こんにちは、私は本当に理解できない奇妙な動作を経験しています。

Touch ID ID をユーザーに提示し、承認されている場合は [self performSegueWithIdentifier: @"callCustomSegue" sender:self]; を呼び出します。このようにブロック内で:

[myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
                  localizedReason:myLocalizedReasonString
                            reply:^(BOOL success, NSError *error) {
                                if (success) {
                                    [self performSegueWithIdentifier: @"callCustomSegue" sender:self];

その後、アプリは数秒間 (少なくとも 3 ~ 4 秒間) 停止し、次の ViewController が表示されます。

「callCustomSegue」によって呼び出される実行は、これを行います。

- (void) perform {

    src = (UIViewController *) self.sourceViewController;
    dst = (UIViewController *) self.destinationViewController;

    [src.view addSubview:dst.view];

}

タッチ ID の識別と performSegueWithIdentifier の間で何が起こっているのか、アプリが停止する理由がわかりません。

タッチ ID をバイパスして performSegueWithIdentifier を呼び出すと、予想どおりすぐに機能します。

タッチIDブロックを入れると:

[myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
                  localizedReason:myLocalizedReasonString
                            reply:^(BOOL success, NSError *error) {
                                if (success) {
                    authenticated = YES;
                        [self showMessage:@"Authentication is successful" withTitle:@"Success"];
                }

showMessage は次のようにします。

 UIAlertController * alert=   [UIAlertController
                                  alertControllerWithTitle:title
                                  message:message
                                  preferredStyle:UIAlertControllerStyleAlert];


    UIAlertAction* cancel = [UIAlertAction
                             actionWithTitle:@"OK"
                             style:UIAlertActionStyleDefault
                             handler:^(UIAlertAction * action)
                             {
                                 [alert dismissViewControllerAnimated:YES completion:nil];

                                 if (authenticated) {
                                     [self performSegueWithIdentifier: @"callCustomSegue" sender:self];
                                 }

                                 if (!authenticated) {
                                     [self touchID];
                                 }

                             }];

[OK] をタップすると、次の ViewController がすぐに呼び出されます。

問題は、タッチ ID ブロック内で performSegue を呼び出してすぐに応答を得られないのはなぜですか?

私が間違っている場所はありますか?

どうもありがとう。

4

1 に答える 1

1

メイン キューですべての UI 関連のアクティビティを実行する必要があります。replytouchID プロセスのブロックは、メイン キューで実行されるとは限りません。実際、そうならないことはほぼ保証できます。

あなたが持っている必要があります-

  if (success) {
     authenticated = YES;
     dispatch_async(dispatch_get_main_queue(), ^{ 
        [self performSegueWithIdentifier: @"callCustomSegue" sender:self];
     });
于 2014-10-30T10:07:05.803 に答える