<i id='x1vg3'></i>
    <fieldset id='x1vg3'></fieldset>
    <ins id='x1vg3'></ins>

    <span id='x1vg3'></span>

    <i id='x1vg3'><div id='x1vg3'><ins id='x1vg3'></ins></div></i><dl id='x1vg3'></dl>

      <code id='x1vg3'><strong id='x1vg3'></strong></code>
    1. <tr id='x1vg3'><strong id='x1vg3'></strong><small id='x1vg3'></small><button id='x1vg3'></button><li id='x1vg3'><noscript id='x1vg3'><big id='x1vg3'></big><dt id='x1vg3'></dt></noscript></li></tr><ol id='x1vg3'><table id='x1vg3'><blockquote id='x1vg3'><tbody id='x1vg3'></tbody></blockquote></table></ol><u id='x1vg3'></u><kbd id='x1vg3'><kbd id='x1vg3'></kbd></kbd>

          <acronym id='x1vg3'><em id='x1vg3'></em><td id='x1vg3'><div id='x1vg3'></div></td></acronym><address id='x1vg3'><big id='x1vg3'><big id='x1vg3'></big><legend id='x1vg3'></legend></big></address>

          Notification与多线程

          • 时间:
          • 浏览:3
          • 来源:124软件资讯网

            一、概述

            多线程中  ,无论在哪个线程注册了视察者  ,Notification吸收和处置惩罚都是在发送Notification的线程中的 。以是  ,当我们需要在吸收到Notification后作出更新UI操作的话  ,就需要思量线程的问题了 ,若是在子线程中发送Notification  ,想要在吸收到Notification后更新UI的话就要切换回到主线程  。先看一个例子:

            - (void)viewDidLoad {
                [super viewDidLoad];

                NSString *NOTIFICATION_NAME = @"NOTIFICATION_NAME";

                NSLog(@"Current thread = %@", [NSThread currentThread]);

                [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:NOTIFICATION_NAME object:nil];

                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

                     NSLog(@"Post notification  ,Current thread = %@", [NSThread currentThread]);

                    [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_NAME object:nil userInfo:nil];


                });

            }

            - (void)handleNotification:(NSNotification *)notification {
                NSLog(@"Receive notification  ,Current thread = %@", [NSThread currentThread]);
            }

            运行效果:

            2017-03-11 17:56:33.898 NotificationTest[23457:1615587] Current thread = <NSThread: 0x608000078080>{number = 1, name = main}
            2017-03-11 17:56:33.899 NotificationTest[23457:1615738] Post notification ,Current thread = <NSThread: 0x60000026c500>{number = 3, name = (null)}
            2017-03-11 17:56:33.899 NotificationTest[23457:1615738] Receive notification  ,Current thread = <NSThread: 0x60000026c500>{number = 3, name = (null)}

            上面我们在主线程注册视察者 ,在子线程发送Notification  ,最后Notification的吸收和处置惩罚也是在子线程  。

            二、重定向Notification到指定线程

            固然  ,想要在子线程发送Notification、吸收到Notification后在主线程中做后续操作  ,可以用一个很笨的要领 ,在 handleNotification 内里强制切换线程:

            - (void)handleNotification:(NSNotification *)notification {
               NSLog(@"Receive notification  ,Current thread = %@", [NSThread currentThread]);
               dispatch_async(dispatch_get_main_queue(), ^{
                  NSLog(@"Current thread = %@", [NSThread currentThread]);
               });
            }

            在简朴情形下可以使用这种要领  ,可是当我们发送了多个Notification而且有多个视察者的时间  ,岂非我们要在每个地方都手动切换线程  ?以是  ,这种要领并不是一个有用的要领 。

            最好的要领是在Notification所在的默认线程中捕捉发送的通知  ,然后将其重定向到指定的线程中  。关于Notification的重定向官方文档给出了一个要领:

            翻译成中文: