私のアプリでは、基本的にドロップダウンフィールドとして4つのテーブルビューにアクセスするために4つのセルを持つテーブルビューを使用する高度な検索ページがあります。これらは、アプリケーションが最初に読み込まれたときに発生するurlリクエストから受け取ったxmlを解析した結果から生成され、appDelegateに格納され、後で高度な検索ページにアクセスするとtableviewsによってアクセスされます。通常の、良いインターネット接続状況では、これは分割秒かかるので、情報はadvのはるか前にあります。検索ページにアクセスすることもできますが、接続が本当に遅い場合には自分自身をカバーしたいと思います。 設定したフラグがfalse(データはまだ要求/解析中)の場合、高度な検索ページのスピナーでalertviewを表示しています。私はこれを動作させることができました。ユーザーがキャンセルしたい場合はキャンセルボタンを押して前のページに戻しました。しかし、フラグがtrue(解析が完了したことを意味する)に変化した場合、アラートが解除され、それが問題になり始めます。私は、フラグが真であるかどうかをチェックし続け、アラートが壊れたときにアラートを却下する無限ループを開始しています。ループはキャンセルボタンを打つことができることから、ユーザーをブロックしていないので、私は別のスレッドでそれを置くが、私が実行時エラーのすべての種類を取得しています:タスクが終了したらUIAlertViewを終了します
0x105330割り当て解除インスタンスに を送っ:- [UIAlertView dismissWithClickedButtonIndex:アニメーション: ]:メッセージはここに関連するコードだ
-(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];
}
だから私の質問は以下のとおりです。
私はそれを却下することができます無限ループチェックの愚かな方法ですか?何とかする必要があります:/
明らかに私はここではメモリが不十分ですが、私はこれをかなり新しくしていますので、私は何が間違っているのか分かりません。そこに速い修正がありますか?
フィードバックありがとうございます!私はあなたが正しいことを疑うことはありませんが、学習のために、なぜ無限ループ法は狂っていますか?また、私は財産として含まれ、合成されていることを含めるべきである。そして私はKVOの全体を調べます。 – Ryan
無限ループの最大の問題はデータ損失です。あなたのコードのどこかで、あなたは何かの価値を変えます。その機会を利用して、値が変わったことを誰にも知らせてください。 KVOは、これを行う方法に組み込まれています。この時点でイベントを発行したり、デリゲートを呼び出すこともできます。代わりに誰かに通知せずに値を変更し、間隔を置いてシステムをポーリングしたり間隔を空けたりすると、CPUサイクルを浪費し、一般的にはどんな感覚でもあります:) –
意味があります:)もう一度ありがとう。 – Ryan