NSURLConnection, NSOperation で検索しててNSOperationQueue 使用時の NSURLConnection のデリゲート用の NSRunLoop 設定方法について書いてあるブログ記事を見付けた。そのブログ記事には
beforeDateに[NSDate distantFuture]を指定しているブログがどっかにありましたが、これは危険です。 beforeDateはいつまでシステムの処理を行うかというパラメーターなので、[NSDate distantFuture]を指定すると下手したら処理が戻って来ません。
と書いてあるけど -[NSRunLoop runMode:beforeDate] のリファレンスには
If no input sources or timers are attached to the run loop, this method exits immediately and returns NO;
て書いてあって NSRunLoop になにもアタッチされていなければ、+[NSDate distantFuture]を指定してもすぐにループを抜けると思う。
こんな感じの手抜きコードでも
#import <Foundation/Foundation.h> @interface RunLoopOperation : NSOperation @end @implementation RunLoopOperation { BOOL isFinished; } - (void)start { NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.apple.com/"]]; NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; [connection start]; while (YES) { // [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:1]]; [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; NSLog(@"Exit run loop."); } } - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { NSLog(@"didReceiveResponse"); } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@"didFinishLoading"); } @end int main (int argc, char const *argv[]) { @autoreleasepool { NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease]; RunLoopOperation *operation = [[[RunLoopOperation alloc] init] autorelease]; [queue addOperation:operation]; [queue waitUntilAllOperationsAreFinished]; } return 0; }
実行すると
2013-06-11 00:32:14.878 rltest[40014:1b03] didReceiveResponse 2013-06-11 00:32:14.879 rltest[40014:1b03] Exit run loop. 2013-06-11 00:32:14.879 rltest[40014:1b03] didFinishLoading 2013-06-11 00:32:14.879 rltest[40014:1b03] Exit run loop. 2013-06-11 00:32:39.613 rltest[40014:1b03] Exit run loop. 2013-06-11 00:32:39.625 rltest[40014:1b03] Exit run loop. 2013-06-11 00:32:39.631 rltest[40014:1b03] Exit run loop. 2013-06-11 00:32:39.720 rltest[40014:1b03] Exit run loop. 2013-06-11 00:32:39.782 rltest[40014:1b03] Exit run loop. 2013-06-11 00:32:41.764 rltest[40014:1b03] Exit run loop.
こんな感じでループを抜けているのがわかる。














