4

解決するためにシームできないというコミットされていないCATransaction警告が表示されます。私のアプリは正常に動作し、期待するすべてのことを実行しています。画面は必要なだけ速くラベルを更新し、すべてが見栄えがします。

    Dec 10 10:40:10 my-iPhone myAppName[5967] <Warning>: CoreAnimation: warning, deleted thread with uncommitted CATransaction; set CA_DEBUG_TRANSACTIONS=1 in environment to log backtraces.

CA_DEBUG_TRANSACTIONS = 1を設定すると、次のリストが見つかりました。

    Dec 10 10:43:45 my-iPhone myAppName[5994] <Warning>: CoreAnimation: warning, deleted thread with uncommitted CATransaction; created by:
    0   QuartzCore                          0x348fc65d <redacted> + 220
    1   QuartzCore                          0x348fc541 <redacted> + 224
    2   QuartzCore                          0x348fc325 <redacted> + 24
    3   QuartzCore                          0x34900489 <redacted> + 44
    4   QuartzCore                          0x34905091 <redacted> + 456
    5   QuartzCore                          0x34904ebf <redacted> + 42
    6   QuartzCore                          0x34904e91 <redacted> + 44
    7   myAppName                       0x000d9ec1 -[MainViewController updateProgress:] + 56
    8   Foundation                          0x3a75067d <redacted> + 972
    9   libsystem_c.dylib                   0x397d6311 <redacted> + 308
    10  libsystem_c.dylib                   0x397d61d8 thread_start + 8

この警告の原因となっているコードは次のようになります。

   - (void)updateProgress:(NSString*) myLabelString
    {
    //this is updating a UILabel on the main view
    [myLabel setText:myLabelString];

    }

これは、performSelectorinBackgroundを呼び出すforループから呼び出されます。

for (;;) {
   // Do stuff here to set up the info for the string

    [self performSelectorInBackground:@selector(updateProgress:) withObject:myLabelString];
    usleep(100000);
    if (stopLoop == YES) {
    // do stuff before we exit for loop            
        break;
    }

}

セレクター「updateProgress」を終了する前にmyLableの更新が完了していることを確認するという考えで、主にいくつかのことを試しました。唯一の効果は、時間(+56)をより大きな数値に変更することです。私も使用しようとしました:

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:1.0f];    
    // edit UILabel here    
    [UIView commitAnimations];

そして、別の投稿からこれを試しましたが、コアアニメーションを使用していないため、コンパイラが宣言されていない識別子として「CATransaction」に反対したことにそれほど驚かされませんでした。

      [CATransaction begin];
      [CATransaction setDisableActions:YES];
      //
      [CATransaction commit];

ラベルの更新が完了したかどうかを判断する方法について何か提案はありますか?アプリが機能していると言ったので、この警告をクリアする必要があります。

4

2 に答える 2

3

この質問は、開発者フォーラムで回答されました。バックグラウンド スレッドで UIKit の作業を行っていたことがわかりました。

私は行を変更しました:

    [self performSelectorInBackground:@selector(updateProgress:) withObject:myLabelString];

に:

    [self performSelectorOnMainThread:@selector(updateProgress:) withObject:myLabelString waitUntilDone:NO];

WaitUntilDone も YES に設定してみましたが、それも機能しました。

于 2012-12-12T04:35:10.937 に答える