代码之家  ›  专栏  ›  技术社区  ›  Henry

iOS上主线程runloop与bg线程runloop的异步下载调度?

  •  0
  • Henry  · 技术社区  · 14 年前

    以下是WWDC 2010第208届会议的幻灯片:

    conn = [[NSURLConnection alloc] initWithRequest:req
      delegate:self startImmediately:NO];
    [conn scheduleInRunLoop: [NSRunLoop currentRunLoop]
      forMode: NSDefaultRunLoopMode];
    [conn start];
    

    在currentRunLoop中放置多个conn有什么问题吗?

    在后台线程的runloop中调度NSURLConnection有什么好处?

    谢谢您!

    1 回复  |  直到 14 年前
        1
  •  2
  •   tc.    14 年前

    使用短语“secondary runloop”表明您不知道run loop是什么。

    NSRunLoop是线程“主循环”的实现。或多或少,

    while ([runLoop waitNextEvent]) {
        NSAutoreleasePool * pool = [NSAutoreleasePool new];
        [runLoop handleEvent];
        [pool release]; pool = nil;
    }
    

    运行循环有一个线程。每个线程最多有一个运行循环。“performSelectorOnMainThread“在运行循环中调度它,但是程序员通常谈论线程,而不是它使用的任何运行循环抽象,因为它们都是相同的。并非所有线程都有运行循环(NSThread的函数通常会给您一个没有运行循环的线程;我认为如果您需要运行循环,您必须自己创建一个)。

    可能 主线程,除非您使用了NSOperation/dispatch.*/etc。如果您在另一个线程上调度它,那么(我认为)委托回调将从另一个线程运行。你可能不想这样。

    现在,线程。

    生成一个大部分时间处于空闲状态的后台线程是没有意义的。NSURLConnection应该只需要很少的处理(你不可能在一开始就把那么多的带宽放到一个电话中);在主运行循环中运行它几乎没有任何开销;线程的开销往往要大得多。

    如果您正在处理数据,并且处理是CPU密集型的,那么您可能希望它在后台线程中运行。您可以将连接放在后台线程中,但一般来说,在主线程中尽可能多地进行连接比较容易。

    我不会开始讨论线程间通信的问题,因为它们是一个主要的问题。只有当您知道需要并发时才使用它。