Ios NSRunLoop从队列上下文执行是否有意义?

Ios NSRunLoop从队列上下文执行是否有意义?,ios,grand-central-dispatch,nsthread,nsrunloop,Ios,Grand Central Dispatch,Nsthread,Nsrunloop,我一直在努力摆脱针对特定线程的目标,更多地考虑iOS竞技场中最佳实践和指导方针所建议的队列 我过去常做的事: 我曾经能够创建一个新线程,然后在其上运行runloop。 每次我想在该线程上运行任务时,我都会调用performselector:onThread:。 这为我提供了一种针对特定线程的方法,更重要的是,我知道这项工作将与我启动的nsrunlop相关联 我看到人们现在使用队列和nsrunlops所做的事情: 我在stack overflow上看到了以下帖子: 我不明白这怎么能解决我以前用线

我一直在努力摆脱针对特定线程的目标,更多地考虑iOS竞技场中最佳实践和指导方针所建议的队列

我过去常做的事: 我曾经能够创建一个新线程,然后在其上运行runloop。 每次我想在该线程上运行任务时,我都会调用performselector:onThread:。 这为我提供了一种针对特定线程的方法,更重要的是,我知道这项工作将与我启动的nsrunlop相关联

我看到人们现在使用队列和nsrunlops所做的事情: 我在stack overflow上看到了以下帖子:

我不明白这怎么能解决我以前用线程做的事情。为什么?这就是我所想的,我想知道我所想的是否正确,或者看看我是否遗漏了一些主要的概念点,这些概念点使我认为这不允许我像以前那样处理线程

  • 据我所知,GCD为用户管理线程。因此,请致电:

    调度异步(调度获取全局队列(调度队列优先级默认为0),。。。。 实际上,我无法知道什么线程与在上面的块中启动的nsrunlop实际关联。 所以,如果我想的没错,GCD在我进入队列时会选择一个线程,那么我如何利用上次GCD将我放入全局队列时启动的同一个运行循环呢

  • 我以前有一个特定线程的静态变量,该线程有一个nsrunlop的入口点。现在,我只想处理队列,如果知道该线程是我启动的特定运行循环,我怎么能说“继续线程a,做大量工作”

    因此,我假设这样做的方法:

    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在特定的运行循环(主线程使用的运行循环除外)上完成工作,并澄清我在这里进行的整个讨论


    谢谢

    请澄清一点-您不能创建运行循环。每个线程都有一个运行循环和
    [NSRunLoop currentlunloop]
    检索该runloop。它不会创建新的runloop。并发编程指南中有一节介绍如何从线程迁移。您可以使用串行或并发队列替换特定的工作线程,或使用并发队列替换线程池Sok,因此,我试图避免这样做[nsrunlop currentRunLoop]在一堆不太忙的线程上,当我在使用队列之前将所有工作转移到同一个线程上时。我有一个对我的线程的引用,所有的工作都会在特定的线程上进行,该线程有一个runloop,即使在不忙的情况下也能让他保持活动状态。如果这些方法可以以任何顺序执行,那么只需在适当的优先级,让GCD来解决。如果你需要一个特定的顺序,那么将它们发送到一个串行队列中。除了GCD的主线程之外,你可能不需要知道任何特定的线程。苹果说:"请务必记住,队列不是替换线程的灵丹妙药。队列提供的异步编程模型适用于延迟不是问题的情况。尽管队列提供了配置队列中任务执行优先级的方法,但较高的执行优先级并不能保证任务的执行因此,在需要最小延迟的情况下,线程仍然是更合适的选择”。因此,如果他们认识到线程可能仍然是一种需要,那么如何在特定线程上发送任务?
    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.
    });