消息机制

消息机制,KVC,KVO

假装没事ソ 提交于 2020-01-07 13:11:25
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> iOS 提供了一种 "同步的" 消息通知机制,观察者只要向消息中心注册, 即可接受其他对象发送来的消息,消息发送者和消息接受者两者可以互相一无所知,完全解耦。 这种消息通知机制可以应用于任意时间和任何对象,观察者可以有多个,所以消息具有广播的性质,只是需要注意的是,观察者向消息中心注册以后,在不需要接受消息时需要向消息中心注销,这种消息广播机制是典型的“Observer”模式。 这个要求其实也很容易实现. 每个运行中的application都有一个NSNotificationCenter的成员变量,它的功能就类似公共栏. 对象注册关注某个确定的notification(如果有人捡到一只小狗,就去告诉我). 我们把这些注册对象叫做 observer. 其它的一些对象会给center发送notifications(我捡到了一只小狗). center将该notifications转发给所有注册对该notification感兴趣的对象. 我们把这些发送notification的对象叫做 poster 消息机制常常用于在向服务器端请求数据或者提交数据的场景,在和服务器端成功交互后,需要处理服务器端返回的数据,或发送响应消息等,就需要用到消息机制。 KVC:Key-Value Coding,直译是:键值编码。简单来讲

线程同步机制的区别与比较及进程通信方法

非 Y 不嫁゛ 提交于 2020-01-07 12:59:21
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 有关多线程的一些技术问题: 1、 何时使用多线程? 2、 线程如何同步? 3、 线程之间如何通讯? 4、 进程之间如何通讯? 先来回答第一个问题,线程实际主要应用于四个主要领域,当然各个领域之间不是绝对孤立的,他们有可能是重叠的,但是每个程序应该都可以归于某个领域: 1、 offloading time-consuming task。由辅助线程来执行耗时计算,而使GUI有更好的反应。我想这应该是我们考虑使用线程最多的一种情况吧。 2、 Scalability。服务器软件最常考虑的问题,在程序中产生多个线程,每个线程做一份小的工作,使每个CPU都忙碌,使CPU(一般是多个)有最佳的使用率,达到负载的均衡,这比较复杂,我想以后再讨论这个问题。 3、 Fair-share resource allocation。当你向一个负荷沉重的服务器发出请求,多少时间才能获得服务。一个服务器不能同时为太多的请求服务,必须有一个请求的最大个数,而且有时候对某些请求要优先处理,这是线程优先级干的活了。 4、 Simulations。线程用于仿真测试。 我把主要的目光放在第一个领域,因为它正是我想要的。第二和第三个领域比较有意思,但是目前不在我的研究时间表中。 线程的同步机制: 1、 Event 用事件(Event

消息通信机制NSNotificationCenter

血红的双手。 提交于 2020-01-05 02:27:03
iPhone开发 之 消息通信 机制 NSNotificationCenter 是本文要介绍的内容,主要是来学习 消息通信 机制 NSNotificationCenter 的学习。最近写程序需要用到这类,研究了下,现把成果和大家分享。 NSNotificationCenter是专门供程序中不同类间的消息通信而设置的,使用起来极为方便, 长话短说。 设置通知,就是说要在什么地方(哪个类)接受通知,一般在初始化中做。 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test:) name:@"test" object:nil]; 我仅对以上参数做以说明:addObserver 这个是观察者,就是说 在什么地方接收通知; selector 这个是收到通知后,调用何种方法; name: 这个是通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。 发送通知,就是说此时要调用观察者处的方法。 [[NSNotificationCenter defaultCenter] postNotificationName:@"test" object:searchFriendArray]; 我仅对以上参数做以说明: postNotificationName:通知的名字,也是通知的唯一标示

NSNotificationCenter消息通信机制

感情迁移 提交于 2020-01-05 02:25:35
作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的. 注册通知:即要在什么地方接受消息 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mytest:) name:@" mytest" object:nil]; 参数介绍: addObserver: 观察者,即在什么地方接收通知;   selector: 收到通知后调用何种方法;   name: 通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。 发送通知:调用观察者处的方法。 [[NSNotificationCenter defaultCenter] postNotificationName:@"mytest" object:searchFriendArray]; 参数: postNotificationName:通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。 object:传递的参数 注册方法的写法: - (void) mytest:(NSNotification*) notification { id obj = [notification object];//获取到传递的对象 } 来源: https://www.cnblogs.com/daijiahong/p

同步、异步、互斥、信号量、阻塞、非阻塞

微笑、不失礼 提交于 2020-01-04 04:55:37
(1)临界资源   在操作系统中, 进程是占有资源的最小单位 (线程可以访问其所在进程内的所有资源,但线程本身并不占有资源或仅仅占有一点必须资源)。但对于某些资源来说,其在同一时间只能被一个进程所占用。这些一次只能被一个进程所占用的资源就是所谓的临界资源。 (2)同步、互斥   相交进程之间的关系主要有两种: 同步 与互斥(一定要记住:不是同步和异步)。所谓互斥,是指散布在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它 们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。所谓同步,是指散步在不同进程之间的若干程序片断,它们的运行必须严格按照规定的 某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。   显然,同步是一种更为复杂的互斥,而互斥是一种特殊的同步。   也就是说互斥是两个线程之间不可以同时运行,他们会相互排斥,必须等待一个线程运行完毕,另一个才能运行,而同步也是不能同时运行,但他是必须要安照某种次序来运行相应的线程(也是一种互斥)!   互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。   同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥

Handler消息传送机制

只愿长相守 提交于 2020-01-01 21:02:18
一、什么是UI线程 当程序第一次启动的时候,Android会同时启动一条主线程( Main Thread)。 主要负责处理与UI相关的事件。 二、UI线程存在的问题 出于性能优化考虑,Android的UI操作并不是线程安全的,意味着如果多个线程并发操作UI线程,可能导致线程安全问题。 为了解决这个问题,Android规定:只允许UI线程修改Activity里的UI组建。 三、消息传送机制作用 为了解决Android应用多线程问题—Android平台只允许UI线程修改Activity里的UI组建,就会导致新启动的线程无法改变界面组建的属性值。 四、Handler的作用(子线程往主线程发送消息的情况) 在新启动的线程中发送消息。 使用Handler对象的sendMessage()方法或者SendEmptyMessage()方法发送消息。 在主线程中获取 处理消息。 重写Handler类中处理消息的方法(void handleMessage(Message msg)),当新启动的线程发送消息时,消息发送到与之关联的MessageQueue。而Hanlder不断地从MessageQueue中获取并处理消息。 五、Hanlder类 Handler类包含如下方法用于发送、处理消息: void handleMessage(Message msg):处理消息的方法,该方法通常用于被重写。

Android 消息推送流程机制

最后都变了- 提交于 2019-12-30 04:29:40
   1.引言   所谓的消息推送就是从服务器端向移动终端发送连接,传输一定的信息。比如一些新闻客户端,每隔一段时间收到一条或者多条通知,这就是从服务器端传来的推送消息;还比如常用的一些IM软件如微信、GTalk等,都具有服务器推送功能。   推送方法如下:   1)通过SMS进行服务器端和客户端的交流通信。   在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,且依赖于运营商。   2)循环主动定时获取   这种方法需要客户端来做一个定时或者周期性的访问服务器端接口,以获得最新的消息。轮询的频率太慢可能导致某些消息的延迟,太快则会大量消耗网络带宽和电池。   3)持久连接   这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。我们需要开一个服务来保持和服务器端的持久连接(苹果就和谷歌的C2DM是这种机制)。但是对于Android系统,当系统可用资源较低,系统会强制关闭我们的服务或者是应用,这种情况下连接会强制中断。(Apple的推送服务之所以工作的很好,是因为每一台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的。即所有的推送服务都是经由一个代理服务器完成的,这种情况下只需要和一台服务器保持持久连接即可。C2DM= Cloud to Device

afx_msg与消息映射机制

邮差的信 提交于 2019-12-28 15:45:18
afx_msg宏表示声明的是一个消息响应函数 消息映射机制是Windows编程的核心内容。Windows下的应用程序也都是通过消息驱动的机制来进行工作的。虽然VC开发环境自带了大量的系统消息处理函数,但我们实际的程序开发过程中总还是避免不了要写一些自定义的消息处理函数以满足所编写的软件功能的需要。那么在VC中如何定义自己的消息处理函数呢?其步骤如下: 1、在要定义消息映射函数的类的首部通过宏定义的方式定义一个用户类型的消息标识。定义方法如下:#define WM_USER1 WM_USER + 1 其中的WM_USER是系统定义好的用户类型的消息。只要以此为自定义消息的起点加上一个偏移量在0~0x3FFF之间的值,就不会和系统定义的其它消息发生冲突了。 2、在类上点击右键,然后在弹出的菜单中选择“添加成员函数”(Add member Function)。在弹出的添加函数对话框中的函数类型框中输入函数的类型。如:afx_msg LRESULT 消息处理函数一定要以afx_msg关键字开头,表明是全局函数。LRESULT是函数的类型。表明是系统回调函数。也可以是其它的类型。如int,void 等等合法的数据类型。在函数名称框中输入函数名。如:MyFunction(WPARAM wParam, LPARAM lParam),这两个参数是系统用于传递消息的附加参数

Dart消息循环机制

谁说我不能喝 提交于 2019-12-28 01:25:02
Dart汇总请点击 这里 概述 异步任务在Dart中随处可见,例如许多库的方法调用都会返回Future对象来实现异步处理,我们也可以注册Handler来响应一些事件,如:鼠标点击事件,I/O流结束和定时器到期。 基本概念 消息循环和消息队列 一个消息循环的职责就是不断从消息队列中取出消息并处理他们直到消息队列为空。      消息队列中的消息可能来自用户输入,文件I/O消息,定时器等。例如下图的消息队列就包含了定时器消息和用户输入消息。    Dart的单线程执行 当一个Dart的方法开始执行时,他会一直执行直至达到这个方法的退出点。换句话说Dart的方法是不会被其他Dart代码打断的。 Note:一个Dart的命令行应用可以通过创建isolates来达到并行运行的目的。isolates之间不会共享内存,它们就像几个运行在不同进程中的app,中能通过传递message来进行交流。出了明确指出运行在额外的isolates或者workers中的代码外,所有的应用代码都是运行在应用的main isolate中。要了解更多相关内容,可以查看 https://www.dartlang.org/articles/event-loop/#use-isolates-or-workers-if-necessary 正如下图所示,当一个Dart应用开始的标志是它的main

安卓handler机制

一个人想着一个人 提交于 2019-12-27 15:24:34
sendMessage方式:根据以上表格中三个关键类,下面分别从源码角度解释其作用 步骤: 1.Handler(创建handler对象时,主要做了两件事,1.指定looper对象;2.指定messageQueue对象) //流程:创建handler对象——>Handler构造方法——>指定当前线程的looper对象 =绑定当前线程——>指定looper对象中保存的消息队列对象MessageQueue /** * a.使用 */ private Handler mhandler = new Handler(){ // 通过复写handlerMessage()从而确定更新UI的操作 @Override public void handleMessage(Message msg) { ...// 需执行的UI操作 } }; /** *b.源码 */ public Handler(Callback callback, boolean async) { // 1. 指定Looper对象 mLooper = Looper.myLooper(); if (mLooper == null) { throw new RuntimeException( "Can't create handler inside thread that has not called Looper.prepare()");