ios - NSOperation + NSURLConnection

标签 ios macos cocoa nsurlconnection nsoperation

我在那个类中创建了 NSOperation 类,我正在调用 NSURLConnection 来获取一些数据。 我在 NSOperation 类中使用主线程调用 NSURLConnectionNSURLConnection 的委托(delegate)设置为 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 ....
}

最佳答案

你说你“想在操作线程上执行响应数据的解析”。您真的需要在操作线程上运行它,还是只需要将它从主线程中取出?操作队列不一定有一个专用的线程,所以这个问题没有多大意义。 (这是调度队列和操作队列的优点之一,它为我们管理线程,我们通常不必参与这些细节。)

如果您只是希望 connectionDidFinishLoading 中的代码在后台线程上运行(例如,如果您在此委托(delegate)方法中执行的操作异常缓慢),只需将其分派(dispatch)到后台线程(您可以为此使用全局队列)。如果您想要这些 connectionDidFinishLoading 调用的串行队列,请为此创建您自己的串行队列并将此代码分派(dispatch)到该队列。但如果它的计算量不是太大(例如解析 JSON 或类似的东西),您通常可以让它在主线程上运行而不会发生意外。

顺便说一句,如果您确实需要,您可以为您的 NSURLConnection 委托(delegate)调用创建一个专用线程,并在该线程上安排连接,但这通常是多余的。但是请参阅 AFNetworking 代码以获取此实现的示例。这在 How do I start an Asychronous NSURLConnection inside an NSOperation? 中有说明。

关于ios - NSOperation + NSURLConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27860439/

相关文章:

ios - AVAsset 轨道为空

ios - Salesforce 移动 SDK iOS - SFNativeRestAppDelegate

swift - 如何在 OSX 应用程序中的本地主机上设置 HTTP 监听器

xcode - 为什么 View Controller 不遵循 segue "Modal"中窗口 Controller 的外观?

objective-c - 当触摸开始时绘制矩形 Objective-c

objective-c - 为什么release不将指针设置为nil而是让它指向已释放的内存?

ios - 是否可以获取用户关注的 Google Plus Feed 的地理位置

ios - 我无法导入 swiftHTTP (rapidAPI)

macos - Apache Tomcat 启动失败

windows - 使用 Qt 4 与 Qt 5 开发适用于 Windows 和 OS X 的应用程序?