来自队列上下文的NSRunLoop有意义吗?

时间:2014-07-07 21:20:17

标签: ios grand-central-dispatch nsthread nsrunloop

我一直试图摆脱针对特定线程的攻击,并更多地考虑iOS领域中的最佳实践和指南所建议的队列。

我用的是什么: 我曾经能够创建一个新线程,然后在其上运行runloop。 每次我想在该线程上运行任务时,我都会调用performselector:onThread:。 这给了我一种定位特定线程的方法,更重要的是知道这项工作将与我开始的NSRunLoop相关联。

我现在看到人们如何使用队列和NSRUNLOOP: 我在堆栈溢出时看到这篇帖子: iOS, NSURLConnection: Delegate Callbacks on Different Thread?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSRunLoop *loop = [NSRunLoop currentRunLoop];
    [connection scheduleInRunLoop:loop forMode:NSRunLoopCommonModes];
    [loop run]; // make sure that you have a running run-loop.
});

我不知道这是如何解决我以前用线程做的事情。为什么?这就是我的想法,我想知道我在想什么是正确的,或者看我是否缺少一些主要的概念点,这让我觉得这不允许我对队列使用我所使用的与线程有关。

  1. 根据我的理解,GCD为用户管理线程。所以,通过调用:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),.... 我实际上无法知道哪个线程实际上与上面的块中启动的NSRUNLOOP相关联。 所以,如果我正在考虑这个问题,GCD会在我排队时选择一个线程,那么我怎样才能利用我上次在GCD上放入全局队列时启动的同一个runloop?

  2. 我曾经有一个特定线程的静态变量,然后有一个NSRUNLOOP的入口点。现在,我只想处理队列,我怎么能说“继续线程A,做一堆工作”知道该线程是我开始的特定runloop?

    所以,我假设这样做的方法:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSRunLoop *loop = [NSRunLoop currentRunLoop];
        [connection scheduleInRunLoop:loop forMode:NSRunLoopCommonModes];
        [loop run]; // make sure that you have a running run-loop.
    });
    
    每次我这样做时,

    都会创建一个新的runloop。相反,我希望能够只运行一个runloop。

    有人能告诉我如何使用队列而不是NSThreads在特定的runloop(主线程使用的那个)上完成工作,并澄清我在这里进行的整个讨论吗?

    谢谢

0 个答案:

没有答案