線程間的通信:
- 什么叫做線程間通信
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
- 方法二:NSPort
- 配置NSMachPort對象---本地線程間通信,通過傳遞端口對象變量進行端口間通訊
- 基本機制:A線程(父線程)創建NSMachPort對象,並加入A線程的run loop。當創建B線程(輔助線程)時,將創建的NSMachPort對象傳遞到主體入口點,B線程(輔助線程)就可以使用相同的端口對象將消息傳回A線程(父線程)。
- NSPort是通過代理模式傳送消息
- it forwards the message to its delegate in a handleMachMessage: or handlePortMessage: message.
- (void)handleMachMessage:(void *)machMessage - (void)handlePortMessage:(NSPortMessage *)portMessage
- 官方文檔翻譯
NSPort是一個描述通信通道的抽象類。通信發生在兩個NSPort對象之中,這兩個NSPort對象通常屬於不同的進程或任務。分發對象系統使用NSPort對象來返回或發送NSProtMessage對象。你應該盡可能使用分發對象來完成應用間通信,必要時才使用NSPort對象。
要接收發來的消息,NSPort對象必須作為輸入源被添加到NSRunLoop對象中。NSConnection對象在初始化時自動添加它們的接收端口。
當一個NSPort對象接收到一個端口消息,便把這條消息在handleMachMessage:或者handlePortMessge:消息中傳送給它的代理。這個代理應該至少實現其中一個方法來處理要接收的消息,不管你想要實現什么功能。handleMachMessage:提供了一個早期的Mach內核消息,它以msg_header_t結構體為起始。handlePortMessage:提供了一個作為NSPortMessage對象的消息,這個對象是Mach消息面向對象的替代品。如果沒有設置代理,這個NSPort對象會自己處理這條消息。
當你使用NSPort對象完成消息處理,你必須首先使這個端口對象失效,然后再發送release消息。類似的處理還有,如果你的應用使用了垃圾回收,你必須先使端口失效,然后移除它的一些強引用。如果你沒有是端口失效,就可能引起內存泄漏。要使端口失效,請調用invalidate方法。
基礎框架定義了三個具體的NSPort子類。NSMachPort和NSMessagePort只允許本地(在一樣的機器上)通信。NSSocketPort允許本地和遠程兩種通訊,但是對於本地通信,NSSocketPort會更加耗費資源。創建NSPort對象,可以使用allocWithZone:或port,NSMachPort對象創建例外。
- GCD的方式
- 子線程回到主線程
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 執行耗時的異步操作... dispatch_async(dispatch_get_main_queue(), ^{ // 回到主線程,執行UI刷新操作 }); });
