2011-07-26 53 views
0

私のアプリでは、基本的にドロップダウンフィールドとして4つのテーブルビューにアクセスするために4つのセルを持つテーブルビューを使用する高度な検索ページがあります。これらは、アプリケーションが最初に読み込まれたときに発生するurlリクエストから受け取ったxmlを解析した結果から生成され、appDelegateに格納され、後で高度な検索ページにアクセスするとtableviewsによってアクセスされます。通常の、良いインターネット接続状況では、これは分割秒かかるので、情報はadvのはるか前にあります。検索ページにアクセスすることもできますが、接続が本当に遅い場合には自分自身をカバーしたいと思います。 設定したフラグがfalse(データはまだ要求/解析中)の場合、高度な検索ページのスピナーでalertviewを表示しています。私はこれを動作させることができました。ユーザーがキャンセルしたい場合はキャンセルボタンを押して前のページに戻しました。しかし、フラグがtrue(解析が完了したことを意味する)に変化した場合、アラートが解除され、それが問題になり始めます。私は、フラグが真であるかどうかをチェックし続け、アラートが壊れたときにアラートを却下する無限ループを開始しています。ループはキャンセルボタンを打つことができることから、ユーザーをブロックしていないので、私は別のスレッドでそれを置くが、私が実行時エラーのすべての種類を取得しています:タスクが終了したらUIAlertViewを終了します

- [UIAlertView dismissWithClickedButtonIndex:アニメーション: ]:メッセージはここに関連するコードだ

0x105330割り当て解除インスタンスに を送っ:

-(void)viewDidAppear:(BOOL)animated 
{ 
    [NSThread detachNewThreadSelector:@selector(waitTilDone) toTarget:self withObject:nil]; 
} 

-(void)waitTilDone{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    while (mainDelegate.artistDone == @"no" || mainDelegate.mediumDone == @"no" || mainDelegate.seriesDone == @"no" || mainDelegate.areaDone == @"no") { 
    } 
    [av dismissWithClickedButtonIndex:0 animated:YES]; 
    [pool release]; 
} 

-(void)viewDidLoad 
{  
    mainDelegate = (PublicArtOmahaAppDelegate*)[[UIApplication sharedApplication]delegate]; 

    if (mainDelegate.artistDone == @"no" || mainDelegate.mediumDone == @"no" || mainDelegate.seriesDone == @"no" || mainDelegate.areaDone == @"no") { 
     av=[[UIAlertView alloc] initWithTitle:@"Loading Form Data" message:@"\n" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; 
     UIActivityIndicatorView *ActInd=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
     [ActInd startAnimating]; 
     [ActInd setFrame:CGRectMake(125, 40, 37, 37)]; 
     [av addSubview:ActInd]; 
     [av show]; 
     [av release]; 
     } 
    [super viewDidLoad]; 
} 

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    // the user clicked on the Cancel button 
    [self dismissModalViewControllerAnimated:YES]; 
} 

だから私の質問は以下のとおりです。

  1. 私はそれを却下することができます無限ループチェックの愚かな方法ですか?何とかする必要があります:/

  2. 明らかに私はここではメモリが不十分ですが、私はこれをかなり新しくしていますので、私は何が間違っているのか分かりません。そこに速い修正がありますか?

答えて

1

1):はい、それは狂っています。キー/値観測(KVO)、[NSNotificationCenter defaultCenter]を使用して、値を実際に変更したときにポーリングする代わりに、独自の代理人などを作成して通知する必要があります。

2):終了するまで解放しないでください。プロパティは多くのものを簡素化するので、ここで役立ちます。

// In header 
@property (nonatomic, retain) UIAlertView *av; 

// When showing it 
self.av = [[[UIAlertView alloc] initWith....] autorelease]; 
... 

// When dismissing it 
[self.av dismiss]; 
self.av = nil; 
+0

フィードバックありがとうございます!私はあなたが正しいことを疑うことはありませんが、学習のために、なぜ無限ループ法は狂っていますか?また、私は財産として含まれ、合成されていることを含めるべきである。そして私はKVOの全体を調べます。 – Ryan

+0

無限ループの最大の問題はデータ損失です。あなたのコードのどこかで、あなたは何かの価値を変えます。その機会を利用して、値が変わったことを誰にも知らせてください。 KVOは、これを行う方法に組み込まれています。この時点でイベントを発行したり、デリゲートを呼び出すこともできます。代わりに誰かに通知せずに値を変更し、間隔を置いてシステムをポーリングしたり間隔を空けたりすると、CPUサイクルを浪費し、一般的にはどんな感覚でもあります:) –

+0

意味があります:)もう一度ありがとう。 – Ryan

関連する問題