使用NSRunloop避免事件驱动的代码

我正在使用NSUrlConnection进行http请求。 我想避免事件驱动的代码,所以我使用NSRunloop的方式如下:

NSURLRequest *request = [[NSURLRequest alloc] initWithURL: [NSURL URLWithString:_urlString] cachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval: 10 ]; NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; if(!connection) { DebugLog(@"Creating a connection has failed"); [self setValidationRequestResult:false]; } else { NSRunLoop* currentRunLoop = [NSRunLoop currentRunLoop]; [self.connection start]; while (self.isConnectionComplete == NO) { NSDate* dateLimit = [NSDate dateWithTimeIntervalSinceNow:0.05]; [currentRunLoop runUntilDate:dateLimit]; } //TODO: check release of NSUrlConnection } } // Now perform remaining tasks ........ 

NSRunLoop可以按照上面所示的方式吗?或者我们应该在“didFailWithError”和“connectionDidFinishLoading”中发布通知来完成http请求之后的逻辑?

虽然这种方法在技术上可能是正确的,但我鼓励你问你为什么要这样做。

NSURLConnection被devise为将自身附加到runloop,所以runloop可以继续,而不是绑定该线程。

我在应用程序中所做的是有一个专门用于pipe理我的networking代码的类,并具有委托callback或通过块来处理完成。 你提到使用通知,这也是一个好主意。

这是asynchronousnetworking代码的本质。 它使代码更复杂一些,但是你的应用程序会更好。