【发布时间】:2014-02-24 10:05:42
【问题描述】:
我想以异步方式接收一些数据到服务器,并避免App UI performance 过载。因此希望将任务发送到辅助队列而不是主队列。
这是我目前使用 “主队列” 的解决方案(我理解 [NSOperationQueue mainQueue] 会降低性能):
-(NSDictionary*) fetchURL:(NSString*)url
{
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:kCONTACTSINFOURL]];
__block BOOL hasError = FALSE;
__block NSDictionary *json;
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
{
//Verify type of connection error
json = [NSJSONSerialization JSONObjectWithData:data
options:0
error:nil];
NSLog(@"Async JSON: %@", json);
}];
if (hasError) {
[[NSOperationQueue mainQueue] suspend];
return nil;
}
return json;
}
为了使用二级队列,避免UI和App性能超载,可以分配一个共享的NSOperationQueue并引用它吗?或者还有其他一些“更好”的类或者实现这一点的方法?
这将是我使用辅助 NSOperationQueue 改进的解决方案:
创建辅助队列:
NSOperationQueue* otherQueue = [NSOperationQueue init];
使用另一个(辅助)队列:
....
[NSURLConnection sendAsynchronousRequest:request
queue:otherQueue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
....
}
这是正确的吗?或者有没有其他方法可以解决这个问题?
【问题讨论】:
-
我认为你正在做的很好。您可能需要考虑在对象中保留队列并为每次调用使用相同的队列。或者可能将其保留为类中的静态。这可能会使以后的调试更容易。
-
谢谢。我已将队列插入到静态类“NetworkManager”中,我可以从应用程序的任何地方访问它。这个想法是如果出现错误(例如没有可用的服务器)挂起辅助队列,将任务重新添加到辅助队列,同时触发每隔几毫秒执行一次的递归线程,这将验证可用性服务器,当服务器备份时将停止并恢复队列。这是一种明智的做法吗?
-
不太确定你想在这里实现什么..? [NSURLConnection sendAsyn...] 在后台使用它自己的队列来发出请求。您传入的队列仅用于在连接完成时执行完成处理程序。不确定为什么要在出现错误时停止获取回调?您是否认为暂停它会停止发出请求?您是否正在尝试实现某种机制来不断了解您是否连接到服务器?
-
是的,不仅如此。我基本上是在实现一个小型聊天应用程序。所以我需要一个队列来将消息发送到服务器。因此,出于这个原因,如果由于服务器脱机错误而没有发送消息,我想暂停消息队列并在连接备份后恢复它。任何更精确的教程/建议都会受到欢迎:-)
-
给我几分钟,我会发布一个答案,以便我可以包含更多细节。
标签: ios multithreading nsoperation nsoperationqueue