最初のアプローチ: 遅延セレクターの使用
おそらくこれを行う最も簡単な方法は、NSObject のperformSelector:withObject:afterDelay:
メソッドを使用することです。次のようにいくつかのメソッドを定義できますparsingDidTimeout
。
- (void)parsingDidTimeout {
if(self.parsingDidComplete == NO) {
[self.parser abortParsing];
// Create your error and display it here
// Try the fetch and parse again...
}
}
これには、パーサーをインスタンス変数 ( self.parser
) として保持し、定義したメソッドからキャンセルできるようにする必要があります。また、パーサー デリゲートが、パーサーが終了したかどうかを追跡する必要があります (は、デリゲートのメソッドでデフォルトに設定および設定self.parsingDidComplete
できます)。これは、成功した解析が中止されるのを避けるためです。これが完了したら、必要なのは簡単ですNO
YES
parserDidEndDocument:
[self performSelector:@selector(parsingDidTimeout) withObject:nil afterDelay:30];
30 秒後、解析中止コードが呼び出され、必要なことは何でも実行できます。
2 番目のアプローチ: タイマーの使用
NSObject メソッド呼び出しの代わりにNSTimerを使用することで、timeout メソッドでこのアプローチ全体を (ほぼ間違いなく) 簡単にすることができます。そうすれば、パーサーが正常に終了した場合は、単純にタイマーを無効にif
して、メソッド内の句を削除できますparsingDidTimeout
(その結果、BOOL
ivar も削除されます)。タイマーの初期化は次のようになります。
NSTimer *timer = [NSTimer timerWithTimeInterval:30.0
target:self
selector:@selector(parsingDidTimeout)
userInfo:nil
repeats:NO];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];