1

iOS 6 アプリの簡単なワークフローがあります。

UINavigationController -> loadingVC -(push)-> UITabBarController -> UIViewController(s)

を介してプッシュを呼び出し、performSegueWithIdentifier:オブザーバーを使用してそれ自体を呼び出しましたNSNotificationCenterが、UITabBarController のルート VC のロードに時間がかかりすぎます (約 35 秒)。

ローディングVCにオブザーバーを登録する方法は次のとおりです。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadingDidComplete) name:@"dataDoneLoading" object:nil];

次に、loadingVC は AppDelegate からいくつかのメソッドを呼び出します。このメソッドは、いくつかのネットワーク処理 (XML ファイルのフェッチと解析) に進み、トリガーされる通知を待ちます:

[self performSegueWithIdentifier:@"finishedLoading" sender:self];

のルート VC のロード時に取得したコンソール ログは次のUITabBarControllerとおりです。

2013-05-06 16:28:19.720 *** [2289:19303] Notif sent
2013-05-06 16:28:19.720 *** [2289:19303] Notif received
2013-05-06 16:28:19.727 *** [2289:19303] viewDidLoad in         (some basic stuff)
2013-05-06 16:28:19.728 *** [2289:19303] viewDidLoad out
2013-05-06 16:28:19.729 *** [2289:19303] viewWillAppear         (NSLog only)
2013-05-06 16:28:54.475 *** [2289:19303] In numberOfSections    (datasource method of a UITableview, returns 0)
2013-05-06 16:28:54.832 *** [2289:12b03] viewDidAppear          (NSLog only)

ご覧のとおりviewWillAppear、プッシュが実際に行われるまでに 35 秒かかります。アプリは にハングアップしloadingVC、通常どおりプッシュします。

これはすべてシミュレーターで行われます (現時点では、物理デバイスでテストすることはできません)。

私が試したこと:

SDSegmentedControlのサブクラスであるを使用していますUISegmentedControlが、後者を使用してみましたが、同じ問題が発生します。

• を削除UINavigationControllerし、プッシュをモーダル セグエに置き換えました。それはより速く動作するように見えますが、UI は完全にめちゃくちゃです: セグエ中にアニメーションはありません (「はい」に設定しても)、タブバーはセグメントをタップするまでテキストやアイコンを表示しません。セグメント化されたコントロールは表示されません。

何が起こっているのか理解できないようです。助けはありますか?

4

1 に答える 1

1

通知のソースによっては、バックグラウンド スレッドでアクションを実行しているように見えますが、これは簡単に発生する可能性があります。UIKit 呼び出し ( など-performSegueWithIdentifier:sender:) はスレッド セーフではなく、メイン スレッド以外のスレッドで呼び出された場合、予測できない結果をもたらします。

-loadingDidCompleteメソッドの先頭を次のように更新してみてください。

-(void)loadingDidComplete {
    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:@selector(loadingDidComplete)
                               withObject:nil
                            waitUntilDone:NO];
        return;
    }

    // ... rest of the method
}
于 2013-05-06T15:33:02.467 に答える