何时使用dispatch_get_main_queue

库纳尔·巴拉尼(Kunal Balani)

我已经了解了iOS中的一条全局规则->从不阻塞主线程。但是,有几次我遇到违反此规则的开源代码段。

以下是两个这样的示例:

以下功能来自https://github.com/piwik/piwik-sdk-ios/blob/master/PiwikTracker/PiwikTracker.m

-(void)startDispatchTimer {

  //在主线程运行循环上运行
  __weak typeof(self)weakSelf = self;
  dispatch_async(dispatch_get_main_queue(),^ {

    [weakSelf stopDispatchTimer];

    //如果调度间隔为0){

      //在计时器上运行
      weakSelf.dispatchTimer = [NSTimer ScheduledTimerWithTimeInterval:weakSelf.dispatchInterval
                                                                目标:弱者
                                                              选择器:@选择器(调度:)
                                                              userInfo:无
                                                               重复:否];

      NSLog(@“调度计时器以间隔%f开始,” weakSelf.dispatchInterval);

    }

  });

}

在上面的代码中,我一直试图理解为什么计时器对象需要主线程。这样的事情与用户界面无关,仍然在主线程上完成。

另一个例子是著名的网络库MKNetworkKit。NSOperation的启动方法中包含以下代码。https://github.com/MugunthKumar/MKNetworkKit/blob/master/MKNetworkKit/MKNetworkOperation.m


dispatch_async(dispatch_get_main_queue(),^ {
      self.connection = [[NSURLConnection alloc] initWithRequest:self.request
                                                        委托人:自己
                                                startImmediately:NO];

      [self.connection scheduleInRunLoop:[NSRunLoop currentRunLoop]
                                 forMode:NSRunLoopCommonModes];

      [自连接开始];
    });

所以我的问题是,为什么人们不使用主线程来执行与UI相关的操作,以及这样做有什么好处?如果您不坚持使用它,它可能不会冻结您的应用程序,但是为什么要冒险。

坂本一树

这两个示例都直接或间接使用NSRunLoop方法。在这种情况下,应从执行目标NSRunLoop的线程中调用方法。因此,您需要dispatch_get_main_queue()。

看看关于NSRunLoop的苹果文档https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/classes/nsrunloop_class/reference/reference.html

警告:NSRunLoop类通常不被认为是线程安全的,并且其方法仅应在当前线程的上下文中调用。您永远不要尝试调用在另一个线程中运行的NSRunLoop对象的方法,因为这样做可能会导致意外的结果。

顺便说一句,NSRunLoop似乎在Core Foundation中使用CFRunLoop,并且Core Foundation是在Apple的开源许可下发布的。

http://opensource.apple.com/source/CF/CF-855.17/CFRunLoop.c

看来CFRunLoop是线程安全的(我们可以看到很多__CFRunLoopLock和__CFRunLoopUnlock组合)。但是无论如何,您还是最好听从文档:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

何时使用dispatch_get_main_queue

来自分类Dev

NSManagedObjectContext内的dispatch_async(dispatch_get_main_queue()

来自分类Dev

iOS:dispatch_async(dispatch_get_main_queue())

来自分类Dev

使用dispatch_async + dispatch_get_main_queue进行UI更新有什么意义?

来自分类Dev

主线程中的dispatch_get_main_queue()

来自分类Dev

重用dispatch_get_main_queue()/ dispatch_get_global_queue()的结果是否安全?

来自分类Dev

了解ios UIView动画块和dispatch_async(dispatch_get_main_queue)块

来自分类Dev

为什么从不调用dispatch_async(dispatch_get_main_queue()之后的块?

来自分类Dev

了解ios UIView动画块和dispatch_async(dispatch_get_main_queue)块

来自分类Dev

在 dispatch_async 队列中的弱自我(dispatch_get_main_queue(),^{})

来自分类Dev

WKWebView的网页未显示dispatch_get_main_queue内的页面

来自分类Dev

用户在执行dispatch_get_main_queue()之前离开当前视图

来自分类Dev

dispatch_get_main_queue()不能顺利运行新的异步作业

来自分类Dev

直接执行方法与在dispatch_async(dispatch_get_main_queue(),^ {})块中有什么区别

来自分类Dev

当dispatch_async(dispatch_get_main_queue())运行时如何从类方法发送信息

来自分类Dev

直接执行方法与在dispatch_async(dispatch_get_main_queue(),^ {})块中有什么区别

来自分类Dev

dispatch_async(dispatch_get_main_queue()在iPad上不起作用,但在iPhone上起作用

来自分类Dev

从oneViewController移至另一个ViewController并再次返回时,dispatch_get_main_queue()不会更新UI

来自分类Dev

从oneViewController移到另一个ViewController并再次返回时,dispatch_get_main_queue()不会更新UI

来自分类Dev

如何使用dispatch_queue_set_specific()和dispatch_get_specific()

来自分类Dev

我在哪里需要在main_queue上使用dispatch_async?

来自分类Dev

苹果为何不赞成使用dispatch_get_current_queue?

来自分类Dev

在iOS 7(Swift)上使用dispatch_get_global_queue时发生EXC_BAD_INSTRUCTION

来自分类Dev

苹果为何不赞成使用dispatch_get_current_queue?

来自分类Dev

函数'dispatch_get_global_queue'的隐式声明

来自分类Dev

多重处理的queue.get()何时返回DONE?

来自分类Dev

在从XCTestCase调用的代码中使用Dispatch.main无效

来自分类Dev

何时在查询 laravel 5 中使用 get()

来自分类Dev

Swift:致命错误:在dispatch_async dispatch_get_global_queue中解开可选值时意外发现nil

Related 相关文章

  1. 1

    何时使用dispatch_get_main_queue

  2. 2

    NSManagedObjectContext内的dispatch_async(dispatch_get_main_queue()

  3. 3

    iOS:dispatch_async(dispatch_get_main_queue())

  4. 4

    使用dispatch_async + dispatch_get_main_queue进行UI更新有什么意义?

  5. 5

    主线程中的dispatch_get_main_queue()

  6. 6

    重用dispatch_get_main_queue()/ dispatch_get_global_queue()的结果是否安全?

  7. 7

    了解ios UIView动画块和dispatch_async(dispatch_get_main_queue)块

  8. 8

    为什么从不调用dispatch_async(dispatch_get_main_queue()之后的块?

  9. 9

    了解ios UIView动画块和dispatch_async(dispatch_get_main_queue)块

  10. 10

    在 dispatch_async 队列中的弱自我(dispatch_get_main_queue(),^{})

  11. 11

    WKWebView的网页未显示dispatch_get_main_queue内的页面

  12. 12

    用户在执行dispatch_get_main_queue()之前离开当前视图

  13. 13

    dispatch_get_main_queue()不能顺利运行新的异步作业

  14. 14

    直接执行方法与在dispatch_async(dispatch_get_main_queue(),^ {})块中有什么区别

  15. 15

    当dispatch_async(dispatch_get_main_queue())运行时如何从类方法发送信息

  16. 16

    直接执行方法与在dispatch_async(dispatch_get_main_queue(),^ {})块中有什么区别

  17. 17

    dispatch_async(dispatch_get_main_queue()在iPad上不起作用,但在iPhone上起作用

  18. 18

    从oneViewController移至另一个ViewController并再次返回时,dispatch_get_main_queue()不会更新UI

  19. 19

    从oneViewController移到另一个ViewController并再次返回时,dispatch_get_main_queue()不会更新UI

  20. 20

    如何使用dispatch_queue_set_specific()和dispatch_get_specific()

  21. 21

    我在哪里需要在main_queue上使用dispatch_async?

  22. 22

    苹果为何不赞成使用dispatch_get_current_queue?

  23. 23

    在iOS 7(Swift)上使用dispatch_get_global_queue时发生EXC_BAD_INSTRUCTION

  24. 24

    苹果为何不赞成使用dispatch_get_current_queue?

  25. 25

    函数'dispatch_get_global_queue'的隐式声明

  26. 26

    多重处理的queue.get()何时返回DONE?

  27. 27

    在从XCTestCase调用的代码中使用Dispatch.main无效

  28. 28

    何时在查询 laravel 5 中使用 get()

  29. 29

    Swift:致命错误:在dispatch_async dispatch_get_global_queue中解开可选值时意外发现nil

热门标签

归档