【发布时间】:2015-01-30 20:47:05
【问题描述】:
我设置了一个类来处理我的 Web API 调用。这是使用NSMutableURLRequest 和NSRLlConnection 完成的。我最初使用 connectionWithRequest: delegate: 并且在大多数情况下运行良好,除非我依赖此请求是真正异步的,而不仅仅是在主运行循环中部分执行。
为此,我认为我会使用非常方便的sendAsynchronousRequest: queue: completionHandler:,起初在我所有的单元测试中,我认为这很有效。它异步执行,我的信号量被等待并正确发出信号,这很棒。
直到我尝试在我的实际应用程序中重新使用我的 Web 服务类的这个新修改版本。我的应用程序的一部分播放视频并使用重复的NSTimer 根据视频的当前播放时间更新部分屏幕。出于某种未知原因,只要我至少执行了这些新的异步NSURLConnections 之一,视频播放和计时器都不再工作。
这是我初始化连接的方式:
[NSURLConnection sendAsynchronousRequest:requestMessage
queue:[[NSOperationQueue alloc] init]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
{
if ( data.length > 0 && connectionError == nil )
{
_webServiceData = [data mutableCopy];
[self performSelector:@selector(connectionDidFinishLoading:) withObject:nil];
}
else if ( connectionError != nil )
{
_webServiceData = [data mutableCopy];
[self performSelector:@selector(webServiceDidFinishExecutingWithError:) withObject:connectionError];
}
}];
这是我如何初始化我的重复计时器:
playbackTimeTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(checkPlaybackTime) userInfo:nil repeats:YES];
而且我完全不知道为什么异步 NSURLConnection 会导致我的应用程序的某些方面与停止运行完全无关。
编辑:
为了澄清,我有ViewControllerA 执行网络请求以检索一些数据。成功检索到该数据后,ViewControllerA 会自动转到ViewControllerB。在ViewControllerB 的viewWillAppear 中,我设置了我的电影播放器和计时器。
【问题讨论】:
-
为什么要使用
performSelector:withObject:([self performSelector:@selector(connectionDidFinishLoading:) withObject:nil];)而不是直接调用方法([self connectionDidFinishLoading:nil])? -
我一定是在想我需要在主线程上做,却忘了切换回来
-
performSelector:withObject:将在当前线程上执行该方法,而不是在主线程上。您的意思是改用performSelectorOnMainThread:withObject:waitUntilDone:吗? -
应该是这样,我可以试试切换到主线程,或者直接调用方法
标签: ios objective-c asynchronous nsurlconnection