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

时间:2012-02-16 01:30:36

标签: ios

我正在使用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是否可以,或者我们应该在httpd请求完成后在“didFailWithError”和“connectionDidFinishLoading”中发布通知来写入逻辑吗?

1 个答案:

答案 0 :(得分:1)

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

NSURLConnection旨在将自身附加到runloop,以便runloop可以继续并且不会占用该线程。

我在我的应用程序中所做的是有一个专门用于管理我的网络代码并具有委托回调或传入块来处理完成的类。您提到使用通知,这也是一个好主意。

这是异步网络代码的本质。它使代码更复杂,但你的应用程序会更好。