我已经在这个类中创建了NSOperation类,我调用NSURLConnection来获取一些数据。我使用NSURLConnection类中的主线程调用NSOperation。NSURLConnection的委托被设置为NSOperation类对象。来自NSURLConnection的调用是在主线程上进行的。我需要使用相同的操作线程来处理这些数据。如何实现?
@implementation ModelCreationSearchOperation {
int try;
}
- (BOOL)isConcurrent
{
return YES;
}
- (void)start
{
[self willChangeValueForKey:@"isExecuting"];
_isExecuting = YES;
[self didChangeValueForKey:@"isExecuting"];
dispatch_async(dispatch_get_main_queue(), ^{
if (self.isCancelled) {
[self finish];
return;
}
});
[self fetchData];
}
-(void)fetchData {
dispatch_async(dispatch_get_main_queue(), ^{
self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
});
}
- (void)finish
{
[self willChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isFinished"];
_isExecuting = NO;
_isFinished = YES;
[self didChangeValueForKey:@"isExecuting"];
[self didChangeValueForKey:@"isFinished"];
[self cancel];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
//Main thread
//Want to perform parsing of response data on operation thread ....
}发布于 2015-01-09 13:06:44
您说您“希望在操作线程上执行响应数据的解析”。您真的需要在操作线程上运行它,还是只需要将其从主线程中删除?操作队列不一定有一个单独的专用线程,所以这个问题没有什么意义。(它是调度队列和操作队列的优点之一,它为我们管理线程,我们通常不需要涉及这些细节。)
如果您只是希望connectionDidFinishLoading中的代码在后台线程上运行(例如,如果您在此委托方法中执行异常慢的操作),只需将其分派到后台线程(可以使用全局队列)。如果您希望为这些connectionDidFinishLoading调用创建一个串行队列,请为此创建自己的串行队列,并将此代码分派到该队列。但是,如果它在计算上不太密集(例如解析JSON或诸如此类的东西),您通常可以让它在主线程上运行,而不会发生意外。
顺便提一下,如果您真的需要,可以为您的NSURLConnection委托调用创建一个专用线程,并在该线程上安排连接,但这通常是过分的。但是,请参阅AFNetworking代码,例如该实现。这在How do I start an Asychronous NSURLConnection inside an NSOperation?中得到了说明
https://stackoverflow.com/questions/27860439
复制相似问题