NSOperation + NSURLConnection
NSOperation + NSURLConnection
我创建了 NSOperation
class class 我正在调用 NSURLConnection
来获取一些数据。
我在 NSOperation
class 中使用主线程调用 NSURLConnection
。
NSURLConnection
的委托设置为 NSOperation
class 对象。
来自 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 ....
}
你说你"want to perform parsing of response data on operation thread."你真的需要运行它在操作线程上,还是只需要把它从主线程?操作队列不一定有一个专用的线程,所以这个问题没有多大意义。 (这是调度队列和操作队列的优点之一,它为我们管理线程,我们通常不必参与这些细节。)
如果您只是想在后台线程上将 connectionDidFinishLoading
中的代码 运行 中的代码(例如,如果您在此委托方法中执行的操作异常缓慢),只需将其分派到一个后台线程(你可以为此使用一个全局队列)。如果您想要这些 connectionDidFinishLoading
调用的串行队列,请为此创建您自己的串行队列并将此代码分派到该队列。但是,如果它的计算量不是太大(例如解析 JSON 或类似的东西),您通常可以在主线程上让它 运行 而不会发生意外。
顺便说一句,如果您确实需要,您可以为 NSURLConnection
委托调用创建一个专用线程,并在该线程上安排连接,但这通常有点矫枉过正。但是请参阅 AFNetworking 代码以获取此实现的示例。 How do I start an Asychronous NSURLConnection inside an NSOperation?
中对此进行了说明
我创建了 NSOperation
class class 我正在调用 NSURLConnection
来获取一些数据。
我在 NSOperation
class 中使用主线程调用 NSURLConnection
。
NSURLConnection
的委托设置为 NSOperation
class 对象。
来自 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 ....
}
你说你"want to perform parsing of response data on operation thread."你真的需要运行它在操作线程上,还是只需要把它从主线程?操作队列不一定有一个专用的线程,所以这个问题没有多大意义。 (这是调度队列和操作队列的优点之一,它为我们管理线程,我们通常不必参与这些细节。)
如果您只是想在后台线程上将 connectionDidFinishLoading
中的代码 运行 中的代码(例如,如果您在此委托方法中执行的操作异常缓慢),只需将其分派到一个后台线程(你可以为此使用一个全局队列)。如果您想要这些 connectionDidFinishLoading
调用的串行队列,请为此创建您自己的串行队列并将此代码分派到该队列。但是,如果它的计算量不是太大(例如解析 JSON 或类似的东西),您通常可以在主线程上让它 运行 而不会发生意外。
顺便说一句,如果您确实需要,您可以为 NSURLConnection
委托调用创建一个专用线程,并在该线程上安排连接,但这通常有点矫枉过正。但是请参阅 AFNetworking 代码以获取此实现的示例。 How do I start an Asychronous NSURLConnection inside an NSOperation?