CN115705212A - 系统平台中的数据响应方法、装置及电子设备 - Google Patents
系统平台中的数据响应方法、装置及电子设备 Download PDFInfo
- Publication number
- CN115705212A CN115705212A CN202110904099.8A CN202110904099A CN115705212A CN 115705212 A CN115705212 A CN 115705212A CN 202110904099 A CN202110904099 A CN 202110904099A CN 115705212 A CN115705212 A CN 115705212A
- Authority
- CN
- China
- Prior art keywords
- target
- data
- system platform
- view control
- program object
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
本申请提供了一种系统平台中的数据响应方法、装置、电子设备及计算机可读存储介质;方法包括:响应于针对响应式数据的更新操作,对响应式数据进行更新处理;从多个程序对象中筛选出与更新后的响应式数据存在订阅关系的目标程序对象;其中,每个程序对象均支持在多种系统平台中运行;运行目标程序对象,在运行过程中根据更新后的响应式数据对目标系统平台的原生视图控件进行分配处理,并在用户界面中显示分配的原生视图控件。通过本申请能够适配不同的系统平台,实现系统平台的原生支持,提升数据响应的相关性能。
Description
技术领域
本申请涉及计算机技术,尤其涉及一种系统平台中的数据响应方法、装置、电子设备及计算机可读存储介质。
背景技术
随着计算机技术的快速发展,演变出了多种系统平台,常见的是移动端(以iOS系统平台及Android系统平台为主)和电脑端(以Windows系统平台及macOS系统平台为主)两大阵营。这四个系统平台的功能都是高度类似的,但由于开发语言、环境的不同,却往往需要投入四份人力分别开发用于部署至各系统平台的应用程序。
在相关技术提供的方案中,为了实现应用程序对不同系统平台的适配,通常是从头创造一整套和各系统平台原生开发不同的运行时架构,采用各种自渲染引擎,抛弃系统平台原生的视觉风格及交互效果,这就导致应用程序的开发方式与各系统平台的原生开发方式差距极大,应用程序的运行性能相较于原生开发来说也存在不同程度的下降。
发明内容
本申请实施例提供一种系统平台中的数据响应方法、装置、电子设备及计算机可读存储介质,能够适配不同的系统平台,实现系统平台的原生支持,提升数据响应的相关性能。
本申请实施例的技术方案是这样实现的:
本申请实施例提供一种系统平台中的数据响应方法,应用于目标系统平台,所述目标系统平台为多种系统平台中的任意一种;所述方法包括:
响应于针对响应式数据的更新操作,对所述响应式数据进行更新处理;
从多个程序对象中筛选出与更新后的所述响应式数据存在订阅关系的目标程序对象;其中,每个所述程序对象均支持在所述多种系统平台中运行;
运行所述目标程序对象,在运行过程中根据更新后的所述响应式数据对所述目标系统平台的原生视图控件进行分配处理,并
在用户界面中显示分配的原生视图控件。
本申请实施例提供一种系统平台中的数据响应装置,应用于目标系统平台,所述目标系统平台为多种系统平台中的任意一种;所述装置包括:
更新模块,用于响应于针对响应式数据的更新操作,对所述响应式数据进行更新处理;
筛选模块,用于从多个程序对象中筛选出与更新后的所述响应式数据存在订阅关系的目标程序对象;其中,每个所述程序对象均支持在所述多种系统平台中运行;
响应模块,用于运行所述目标程序对象,在运行过程中根据更新后的所述响应式数据对所述目标系统平台的原生视图控件进行分配处理,并在用户界面中显示分配的原生视图控件。
本申请实施例提供一种电子设备,包括:
存储器,用于存储可执行指令;
处理器,用于执行所述存储器中存储的可执行指令时,实现本申请实施例提供的系统平台中的数据响应方法。
本申请实施例提供一种计算机可读存储介质,存储有可执行指令,用于引起处理器执行时,实现本申请实施例提供的系统平台中的数据响应方法。
本申请实施例具有以下有益效果:
在接收到针对响应式数据的更新操作时,对响应式数据进行更新处理,并通过与更新后的响应式数据存在订阅关系的目标程序对象来实现对更新操作的响应,由于程序对象能够支持在多种系统平台中运行,因此能够在不改变系统平台原生底层机制的基础上实现数据响应,提升数据响应的相关性能(如响应效率),同时也可以适配不同的系统平台;此外,数据响应是通过显示目标系统平台的原生视图控件来实现的,因此能够保留目标系统平台原生的视觉风格及交互效果。
附图说明
图1是本申请实施例提供的系统平台中的数据响应系统的架构示意图;
图2是本申请实施例提供的终端设备的架构示意图;
图3A是本申请实施例提供的系统平台中的数据响应方法的流程示意图;
图3B是本申请实施例提供的系统平台中的数据响应方法的流程示意图;
图3C是本申请实施例提供的系统平台中的数据响应方法的流程示意图;
图4是本申请实施例提供的虚拟视图树的示意图;
图5是本申请实施例提供的客户端开发框架的示意图;
图6是本申请实施例提供的建立订阅关系的示意图;
图7是本申请实施例提供的数据驱动的示意图;
图8是本申请实施例提供的界面布局及上屏显示的示意图;
图9A是本申请实施例提供的iOS系统平台中的用户界面的示意图;
图9B是本申请实施例提供的Android系统平台中的用户界面的示意图;
图9C是本申请实施例提供的macOS系统平台中的用户界面的示意图;
图9D是本申请实施例提供的Windows系统平台中的用户界面的示意图。
具体实施方式
为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述,所描述的实施例不应视为对本申请的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。在以下的描述中,所涉及的术语“多个”是指至少两个。
除非另有定义,本文所使用的所有的技术和科学术语与属于本申请的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本申请实施例的目的,不是旨在限制本申请。
对本申请实施例进行进一步详细说明之前,对本申请实施例中涉及的名词和术语进行说明,本申请实施例中涉及的名词和术语适用于如下的解释。
1)系统平台(Computing Platform):指电子设备中用于支持应用程序运行的系统环境,在本申请实施例中,可以通过操作系统来区分不同的系统平台,操作系统包括但不限于iOS、Android、macOS及Windows。
2)响应式数据:当数据发生变化时,可以根据设定的规则触发一系列相关操作,这类数据便称为响应式数据,可以理解为数据是“活”的。在本申请实施例中,响应式数据用于实现数据响应(或称数据驱动)。
3)程序对象:泛指使用通用的编程语言(Programming Language)所编写的代码,其中,该通用的编程语言是多种系统平台原生支持的,因此,程序对象可以在多种系统平台中运行。例如,对于iOS系统平台、Android系统平台、macOS系统平台及Windows系统平台来说,通用的编程语言可以是C++。本申请实施例对程序对象的功能不做限定,例如可以是用于显示特定的原生视图控件。
4)原生视图控件:指系统平台原生支持的视图控件,可以借助系统平台进行无障碍地显示,例如,原生视图控件可以是指在操作系统的设计过程中定义好的、能够通过操作系统进行直接显示的视图控件。举例来说,对于iOS系统平台、Android系统平台、Windows系统平台以及macOS系统平台来说,用于显示标签的原生视图控件分别为UILabel、TextView、ClabelUI以及NSTextField。在使用原生视图控件之前,需要创建(新建)原生视图控件;在不需要使用原生视图控件时,可以删除(销毁)原生视图控件,以节省存储空间。
5)虚拟视图树:记录有若干个组件以及组件之间的关系(如顺序),其中,组件用于模拟系统平台中的原生视图控件,即与原生视图控件存在映射关系(对应关系)。由于直接对原生视图控件进行相关计算的计算量过大,因此,本申请实施例可以构建虚拟视图树,对虚拟视图树中的组件进行相关计算,最终再将组件映射为原生视图控件,如此,能够节省数据响应过程中的计算量,降低对电子设备的性能要求。
对于不同的系统平台,相关技术提供了跨系统平台的一些解决方案,例如Electron、Flutter等,但这些方案都从头创造了一整套和各系统平台原生开发不同的运行时架构,采用各种自渲染引擎,抛弃了系统平台原生的视觉风格及交互效果,这就导致这些方案与各系统平台的原生开发方式差距极大,进一步导致以下问题的出现:1)产出的应用程序的包体积明显增大,简便性差,不利于在各系统平台中部署;2)应用程序的运行性能相较于原生开发来说存在不同程度的下降;3)应用程序中存在大量跨语言通信的胶水代码;4)调试麻烦,效率低下;5)学习和迁移成本非常高。
本申请实施例提供一种系统平台中的数据响应方法、装置、电子设备及计算机可读存储介质,能够适配不同的系统平台,在不改变系统平台原生底层机制的基础上实现数据响应,提升数据响应的相关性能,同时保留系统平台原生的视觉风格及交互效果。下面说明本申请实施例提供的电子设备的示例性应用,本申请实施例提供的电子设备可以实施为各种类型的终端设备,也可以实施为服务器。
参见图1,图1是本申请实施例提供的系统平台中的数据响应系统100的一个架构示意图,终端设备400通过网络300连接服务器200,其中,网络300可以是广域网或者局域网,又或者是二者的组合。
在一些实施例中,以电子设备是终端设备为例,本申请实施例提供的系统平台中的数据响应方法可以由终端设备实现。例如,终端设备400在接收到针对响应式数据的更新操作(例如由用户触发的更新操作)时,对响应式数据进行更新处理;从多个程序对象中筛选出与更新后的响应式数据存在订阅关系的目标程序对象;运行目标程序对象,在运行过程中根据更新后的响应式数据对目标系统平台的原生视图控件进行分配处理,并在用户界面中显示分配的原生视图控件。其中,目标系统平台是指终端设备400的系统平台,每个程序对象均支持在多种系统平台中运行。作为示例,在图1的用户界面中示出了原生视图控件1及原生视图控件2。
值得说明的是,上文的响应式数据及多个程序对象可以集成于应用程序中,终端设备400可以通过部署该应用程序,从而实现在目标系统平台中的数据响应,其中,部署如下载并安装,当然部署方式并不限于此。
在一些实施例中,本申请实施例提供的系统平台中的数据响应方法也可以由终端设备及服务器协同实现。例如,服务器200可以将集成有响应式数据及多个程序对象的应用程序发送至终端设备400,终端设备400在部署该应用程序后,即可在自身的目标系统平台中实现数据响应。对于应用程序的开发人员来说,可以借助服务器200来进行应用程序的开发,也可以借助其他的电子设备(如终端设备或服务器)来进行应用程序的开发,并将开发出的应用程序存储至服务器200。值得说明的是,对应用程序的开发工作包括但不限于响应式数据的设定、程序对象的设定、订阅关系的设定。
在一些实施例中,可以将数据响应过程中涉及到的各种结果(如响应式数据、程序对象、集成有响应式数据及多个程序对象的应用程序等)存储至区块链中,由于区块链具有不可篡改的特性,因此能够保证区块链中的数据的准确性。电子设备可以向区块链发送查询请求,以查询区块链中存储的数据。
在一些实施例中,终端设备400或服务器200可以通过运行计算机程序来实现本申请实施例提供的系统平台中的数据响应方法,例如,计算机程序可以是操作系统中的原生程序或软件模块;可以是本地(Native)应用程序(APP,Application),即需要在操作系统中安装才能运行的程序,如上文的客户端410;也可以是小程序,即只需要下载到浏览器环境中就可以运行的程序;还可以是能够嵌入至任意APP中的小程序。总而言之,上述计算机程序可以是任意形式的应用程序、模块或插件。
在一些实施例中,服务器200可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(Content DeliveryNetwork,CDN)、以及大数据和人工智能平台等基础云计算服务的云服务器,其中,云服务可以是应用程序服务,供终端设备400进行调用,以便终端设备400获取应用程序。终端设备400可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能电视、智能手表等,但并不局限于此。终端设备以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本申请实施例中不做限制。
以本申请实施例提供的电子设备是终端设备为例说明,可以理解的,对于电子设备是服务器的情况,图2中示出的结构中的部分(例如用户接口、呈现模块和输入处理模块)可以缺省。参见图2,图2是本申请实施例提供的终端设备400的结构示意图,图2所示的终端设备400包括:至少一个处理器410、存储器450、至少一个网络接口420和用户接口430。终端设备400中的各个组件通过总线系统440耦合在一起。可理解,总线系统440用于实现这些组件之间的连接通信。总线系统440除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图2中将各种总线都标为总线系统440。
处理器410可以是一种集成电路芯片,具有信号的处理能力,例如通用处理器、数字信号处理器(DSP,Digital Signal Processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其中,通用处理器可以是微处理器或者任何常规的处理器等。
用户接口430包括使得能够呈现媒体内容的一个或多个输出装置431,包括一个或多个扬声器和/或一个或多个视觉显示屏。用户接口430还包括一个或多个输入装置432,包括有助于用户输入的用户接口部件,比如键盘、鼠标、麦克风、触屏显示屏、摄像头、其他输入按钮和控件。
存储器450可以是可移除的,不可移除的或其组合。示例性的硬件设备包括固态存储器,硬盘驱动器,光盘驱动器等。存储器450可选地包括在物理位置上远离处理器410的一个或多个存储设备。
存储器450包括易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(ROM,Read Only Memory),易失性存储器可以是随机存取存储器(RAM,Random Access Memory)。本申请实施例描述的存储器450旨在包括任意适合类型的存储器。
在一些实施例中,存储器450能够存储数据以支持各种操作,这些数据的示例包括程序、模块和数据结构或者其子集或超集,下面示例性说明。
操作系统451,包括用于处理各种基本系统服务和执行硬件相关任务的系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务;
网络通信模块452,用于经由一个或多个(有线或无线)网络接口420到达其他电子设备,示例性的网络接口420包括:蓝牙、无线相容性认证(WiFi)、和通用串行总线(USB,Universal Serial Bus)等;
呈现模块453,用于经由一个或多个与用户接口430相关联的输出装置431(例如,显示屏、扬声器等)使得能够呈现信息(例如,用于操作外围设备和显示内容和信息的用户接口);
输入处理模块454,用于对一个或多个来自一个或多个输入装置432之一的一个或多个用户输入或互动进行检测以及翻译所检测的输入或互动。
在一些实施例中,本申请实施例提供的装置可以采用软件方式实现,图2示出了存储在存储器450中的系统平台中的数据响应装置455,其可以是程序和插件等形式的软件,包括以下软件模块:更新模块4551、筛选模块4552及响应模块4553,这些模块是逻辑上的,因此根据所实现的功能可以进行任意的组合或进一步拆分。将在下文中说明各个模块的功能。
将结合本申请实施例提供的电子设备的示例性应用和实施,说明本申请实施例提供的系统平台中的数据响应方法。
参见图3A,图3A是本申请实施例提供的系统平台中的数据响应方法的一个流程示意图,该方法可以由电子设备执行,将结合图3A示出的步骤进行说明。
在步骤101中,响应于针对响应式数据的更新操作,对响应式数据进行更新处理。
本申请实施例可以适用于多种系统平台,为了便于理解,以某个电子设备中的目标系统平台为例进行说明,该目标系统平台可以是多种系统平台中的任意一种。
电子设备存储有响应式数据及多个程序对象,其中,程序对象是基于多种系统平台通用的编程语言进行编写得到的,因此能够在多种系统平台中运行。电子设备可以基于响应式数据及多个程序对象来实现目标系统平台中的数据响应,接下来进行示例说明。
首先,电子设备在接收到针对响应式数据的更新操作时,对响应式数据进行更新处理。其中,更新操作可以是在用户界面中接收到的,例如,用户界面中显示有响应式数据,则可以接收针对用户界面中的响应式数据的更新操作;又例如,用户界面中显示有响应式数据对应的原生视图控件,则可以将针对用户界面中的该原生视图控件的更新操作,作为针对响应式数据的更新操作。
值得说明的是,本申请实施例对更新操作的类型不做限定,例如可以是触摸式的操作(如点击、长按、滑动等),也可以是非触摸式的操作(如语音输入、手势输入等)。
值得说明的是,更新处理是用于对响应式数据的数据值进行更新,例如将响应式数据的数据值从1更新为2,更新处理的过程不会对响应式数据相关的订阅关系造成影响。此外,本申请实施例对响应式数据的数量不做限定。
在一些实施例中,步骤101之前,还包括:运行多个程序对象中的封装消息程序对象,以触发目标系统平台中的消息循环;其中,封装消息程序对象是对多种系统平台分别对应的消息程序对象进行封装处理得到的;其中,消息循环用于进行与目标系统平台之间的消息传输,消息循环所传输的消息包括更新操作。
在本申请实施例中,可以通过目标系统平台中的消息循环(Message Loop)机制来实现数据响应。例如,可以运行多个程序对象中的封装消息程序对象,以在封装消息程序对象的运行过程中触发目标系统平台中的消息循环,该消息循环用于进行与目标系统平台之间的消息传输。其中,封装消息程序对象是对多种系统平台分别对应的消息程序对象进行封装处理得到的,因此能够支持在多种系统平台中运行;消息循环所传输的消息至少包括针对响应式数据的更新操作。
在本申请实施例中,可以将响应式数据及多个程序对象集成在应用程序中,电子设备部署应用程序。在该情况下,封装消息程序对象所触发的消息循环实质上是用于进行应用程序与目标系统平台之间的消息传输,例如目标系统平台在接收到针对响应式数据的更新操作时,将更新操作通过消息循环发送至应用程序,以使应用程序实现数据响应。
通过上述方式,能够符合目标系统平台的消息驱动的特点,与目标系统平台进行有效通信,从而实现准确的数据响应。
在步骤102中,从多个程序对象中筛选出与更新后的响应式数据存在订阅关系的目标程序对象;其中,每个程序对象均支持在多种系统平台中运行。
这里,从多个程序对象中筛选出与更新后的响应式数据存在订阅关系的程序对象,为了便于区分,将筛选出的程序对象命名为目标程序对象。其中,响应式数据与程序对象之间的订阅关系可以预先建立并进行存储,一个响应式数据可以与一个或多个程序对象之间存在订阅关系,根据实际应用场景而定。
在一些实施例中,当目标程序对象的数量为零时,删除更新后的响应式数据。
这里,当未筛选出与更新后的响应式数据存在订阅关系的程序对象,即目标程序对象的数量为零时,可以直接删除更新后的响应式数据,从而节省电子设备的存储空间,同时避免进行无效的数据响应。
在步骤103中,运行目标程序对象,在运行过程中根据更新后的响应式数据对目标系统平台的原生视图控件进行分配处理,并在用户界面中显示分配的原生视图控件。
这里,在目标系统平台中运行目标程序对象,在目标程序对象的运行过程中,根据更新后的响应式数据对目标系统平台的原生视图控件进行分配处理,即选择哪个或哪些原生视图控件需要进行显示,最终在用户界面中显示分配的原生视图控件。其中,原生视图控件的分配逻辑可以根据实际应用场景进行设定。
通过在用户界面中显示分配的原生视图控件,能够实现对更新操作的响应,同时实现与用户之间的交互;同时,原生视图控件是目标系统平台原生支持的,因此能够保留目标系统平台原生的视觉风格及交互效果,提升用户体验。
值得说明的是,目标程序对象的数据响应逻辑并不限于分配原生视图控件,例如还可以是在用户界面中显示更新后的响应式数据(如显示数据值),又例如还可以是对更新后的响应式数据进行进一步运算,可以根据实际应用场景而定。
在一些实施例中,步骤102之后,还包括:将目标程序对象添加至待运行列表中;当目标程序对象的数量为多个时,可以通过这样的方式来实现上述的运行目标程序对象:根据待运行列表中的多个目标程序对象的创建顺序,依次运行多个目标程序对象。
例如,对于更新后的响应式数据来说,可以将对应的目标程序对象添加至待运行列表中,以待后续运行。这里,当更新后的响应式数据的数量为多个(例如在一个消息循环中接收到针对多个响应式数据的更新操作)时,可以将多个更新后的响应式数据分别对应的目标程序对象添加至同一待运行列表中。其中,当不同更新后的响应式数据对应同一目标程序对象时,可以仅执行一次将该同一目标程序对象添加至待运行列表中的操作,即待运行列表包括的是互不相同的目标程序对象,如此,能够避免无效的重复添加,节省计算资源。
在当前消息循环的下一个消息循环开始前,可以根据待运行列表中的多个目标程序对象的创建顺序,依次运行多个目标程序对象。例如,根据待运行列表中的多个目标程序对象的创建时间从早到晚的顺序,依次运行多个目标程序对象。如此,能够保证目标程序对象的运行时机的准确性,提升数据响应的有序性。
在一些实施例中,在目标程序对象的运行过程中,还包括:对更新后的响应式数据进行函数运算处理,得到返回数据值;其中,返回数据值用于被与目标程序对象存在订阅关系的程序对象调用。
在本申请实施例中,程序对象可以分为有返回值和无返回值两类,无返回值的程序对象如步骤103中的目标程序对象;有返回值的程序对象可以具有双重身份,既可以主动订阅响应式数据,又可以作为响应式数据,以被其他程序对象订阅。
以目标程序对象进行举例,在目标程序对象的运行过程中,可以对更新后的响应式数据进行函数运算处理,得到返回数据值。其中,对函数运算处理的方式不做限定,例如可以是将更新后的响应式数据的数据值(目标数据值)乘以2,得到返回数据值。目标程序对象在运行过程中得到的返回数据值可以被其他的程序对象调用,其中,该其他的程序对象与目标程序对象存在订阅关系,即订阅了作为响应式数据的目标程序对象。通过上述方式,能够提升数据响应的多样性和可扩展性,便于扩展到更多的应用场景中。
在一些实施例中,步骤103之后,还包括:响应于针对分配的原生视图控件的触发操作,运行多个程序对象中的功能跳转程序对象,以在用户界面中显示原生功能的执行过程。
完成对分配的原生视图控件的显示之后,可以通过用户界面接收针对分配的原生视图控件的触发操作。对于分配的原生视图控件对应目标系统平台的原生功能的情况,当接收到针对分配的原生视图控件的触发操作时,可以运行多个程序对象中的功能跳转程序对象,以在功能跳转程序对象的运行过程中,将原生功能的执行过程显示于用户界面。
原生功能是指基于目标系统平台原生开发的功能,例如显示文本的功能、播放视频的功能等,本申请实施例对此不做限定。在将用户界面中显示的内容从分配的原生视图控件切换为原生功能的执行过程时,可以通过上下文(Context)、推入(Push)、弹出(Pop)、升起(Present)或降下(Dismiss)等切换方式来实现,对此不做限定。
值得说明的是,本申请实施例对涉及的触发操作的类型不做限定,例如可以是触摸式的操作(如点击、长按、滑动等),也可以是非触摸式的操作(如语音输入、手势输入等)。
通过上述方式,能够将本申请实施例提供的数据响应机制与目标系统平台的原生功能结合起来,实现灵活切换,提升对不同应用场景的适用性。
如图3A所示,本申请实施例能够在不改变系统平台原生底层机制的基础上实现数据响应,提升数据响应的相关性能(如响应效率),同时也可以适配不同的系统平台,降低开发难度;此外,数据响应是通过显示目标系统平台的原生视图控件来实现的,因此能够保留目标系统平台原生的视觉风格及交互效果,提升用户体验。
在一些实施例中,参见图3B,图3B是本申请实施例提供的系统平台中的数据响应方法的一个流程示意图,可以由电子设备执行。在图3B中,图3A示出的步骤103可以通过步骤201至步骤204实现,将结合各步骤进行说明。
在步骤201中,运行目标程序对象,在运行过程中根据更新后的响应式数据对目标程序对象包括的多个组件进行筛选处理,得到目标组件。
这里,目标程序对象包括多个组件,其中每个组件对应目标系统平台中的一个原生视图控件。在目标程序对象的运行过程中,可以根据更新后的响应式数据对目标程序对象包括的多个组件进行筛选处理,得到目标组件,其中,对目标组件的数量不做限定,可以是一个或多个。
在一些实施例中,更新后的响应式数据的数据值(目标数据值)可以用于决定目标程序对象中的每个组件是否需要显示,这里的显示组件是指显示组件对应的原生视图控件。例如,目标程序对象包括组件C1、C2、C3、C4及C5,组件C1、C2及C3被设定为在响应式数据A的数据值为1时进行显示,组件C4及C5被设定为在响应式数据A的数据值为2时进行显示,则当更新后的响应式数据A的数据值为2时,确定筛选出的目标组件包括C4及C5。
在步骤202中,在运行过程中将基于目标系统平台创建的、且与目标组件对应的原生视图控件分配给目标组件,并根据分配的原生视图控件确定目标组件的显示尺寸。
这里,在目标程序对象的运行过程中,将基于目标系统平台创建的(由目标系统平台原生支持)、且与目标组件对应的原生视图控件分配给目标组件,并根据分配的原生视图控件确定目标组件的显示尺寸。例如,可以计算分配的原生视图控件在用户界面中完整显示所需的显示尺寸,以作为目标组件的显示尺寸。
值得说明的是,同一原生视图控件可以分配给多个目标组件,如同一类型的多个目标组件。
值得说明的是,某些目标组件可能与所有原生视图控件均不对应,对于这类目标组件,可以获取默认设置的显示尺寸。例如某个目标组件用于显示空格,则默认的显示尺寸可以为空格所占的显示尺寸。
在一些实施例中,可以通过这样的方式来实现上述的将基于目标系统平台创建的、且与目标组件对应的原生视图控件分配给目标组件:从目标程序对象对应的视图复用池中查询目标组件对应的原生视图控件,并将查询到的原生视图控件分配给目标组件;其中,视图复用池用于存储基于目标系统平台创建的、且在目标程序对象的历史运行过程中分配的原生视图控件。
为了避免重复创建、销毁原生视图控件所导致的计算资源浪费,在本申请实施例中,可以基于视图复用池来实现原生视图控件的分配。例如,从目标程序对象对应的视图复用池中查询目标组件对应的原生视图控件,并将查询到的原生视图控件分配给目标组件,该视图复用池用于存储基于目标系统平台创建的、且在目标程序对象的历史运行过程中分配的原生视图控件。其中,历史运行过程可以是指上一次的运行过程,也可以是指历史上若干次的运行过程。通过上述方式,能够复用历史分配的原生视图控件,从而节省计算资源。
在一些实施例中,将基于目标系统平台创建的、且与目标组件对应的原生视图控件分配给目标组件之后,还包括:删除视图复用池中未分配的原生视图控件。
在目标程序对象的运行过程中,若已经为所有目标组件分配了原始视图控件,且此时视图复用池中还存在未分配的原生视图控件,则证明未分配的原生视图控件没有必要继续存储,可以删除(销毁)视图复用池中未分配的原生视图控件。如此,能够有效地节省存储资源。
在一些实施例中,当视图复用池中不存在目标组件对应的原生视图控件时,基于目标系统平台创建与目标组件对应的原生视图控件,并将创建的原生视图控件分配给目标组件;其中,创建的原生视图控件用于存储至视图复用池中。
这里,当从目标程序对象对应的视图复用池中未查询到目标组件对应的原生视图控件时,可以基于目标系统平台创建与目标组件对应的原生视图控件,并将创建的原生视图控件分配给目标组件。目标程序对象的本次运行过程中创建的原生视图控件可以存储至视图复用池中,以在目标程序对象的下一次运行过程中使用。
在步骤203中,在运行过程中根据目标组件的显示尺寸进行界面布局处理,得到目标组件的显示参数;其中,目标组件的显示参数包括显示尺寸及显示位置。
在目标程序对象的运行过程中,可以根据所有目标组件的显示尺寸进行界面布局处理,得到各个目标组件的显示参数,其中,目标组件的显示参数包括显示尺寸及显示位置;对界面布局处理所依赖的界面布局规则不做限定,例如可以是弹性布局规则(如Flex布局规则)。
值得说明的是,目标组件的显示参数中的显示尺寸与进行界面布局处理前的显示尺寸可以相同或不同,根据界面布局规则而定。
在步骤204中,在运行过程中根据目标组件的显示参数,在用户界面中显示分配的原生视图控件。
在目标程序对象的运行过程中,根据目标组件的显示参数,在用户界面中显示分配给目标组件的原生视图控件,从而实现合理显示。相较于原生视图控件来说,对目标组件进行相关计算的计算量较小,因此,能够减少数据响应过程中的计算量,实现更加快速的数据响应。
在一些实施例中,可以通过这样的方式来实现上述的根据更新后的响应式数据对目标程序对象包括的多个组件进行筛选处理,得到目标组件:根据目标程序对象构建虚拟视图树;其中,虚拟视图树包括多个分支,每个分支包括多个组件,且不同分支对应响应式数据的不同数据值;对更新后的响应式数据进行取值处理,得到目标数据值;在多个分支中筛选出与目标数据值对应的目标分支,并将目标分支中的组件作为目标组件。
例如,目标程序对象包括至少一个函数闭包(Closure),目标程序对象的运行过程实质上是目标程序对象内的函数闭包的运行过程,其中,函数闭包用于捕获外部作用域的变量并在函数内部使用,这里捕获了响应式数据,可在函数内部对其进行求值、修改等操作。
对于目标程序对象内的每个函数闭包,可以对函数闭包进行逻辑展开(如对函数闭包中的循环和条件进行展开),以根据函数闭包内的各个组件的顺序来构建虚拟视图树,其中,虚拟视图树包括多个分支,每个分支包括多个组件,且不同分支对应响应式数据的不同数据值。同时,对更新后的响应式数据进行取值处理,为了便于区分,将这里得到的数据值命名为目标数据值。然后,在虚拟视图树的多个分支中筛选出与目标数据值对应的目标分支,并将目标分支中的组件作为目标组件。
为了便于理解,提供了如图4所示的示意图,构建的虚拟视图树包括分支1和分支2,其中,组件C0为根节点,分支1包括组件C0和组件C1,对应的是响应式数据的数据值1;分支2包括组件C0和组件C2,对应的是响应式数据的数据值2。对于该情况,当目标数据值为1时,将分支1作为目标分支,将组件C0和组件C1均作为目标组件。通过上述方式,能够提升组件筛选的有效性和准确性。
值得说明的是,在以函数闭包为单位进行数据响应的情况下,虚拟视图树与视图复用池之间可以是一对一的关系,即针对每个虚拟视图树建立一个视图复用池,从而支持虚拟视图树在不同时间的显示。
在一些实施例中,可以通过这样的方式来实现上述的将基于目标系统平台创建的、且与目标组件对应的原生视图控件分配给目标组件:对目标分支中的多个目标组件进行初次递归处理,并在初次递归过程中执行以下处理:将基于目标系统平台创建的、且与初次递归到的目标组件对应的原生视图控件分配给初次递归到的目标组件。
这里,对虚拟视图树的目标分支中的多个目标组件进行初次递归处理,即是按照目标分支中的逻辑(顺序)遍历目标分支中的多个目标组件,以图4为例,则是按照“组件C0-组件C1”的顺序进行初次递归处理。在初次递归过程中,将基于目标系统平台创建的、且与初次递归到的目标组件对应的原生视图控件分配给初次递归到的目标组件。如此,可以实现有序分配。
在一些实施例中,可以通过这样的方式来实现上述的根据目标组件的显示参数,在用户界面中显示分配的原生视图控件:对目标分支中的多个目标组件进行再次递归处理,并在再次递归过程中执行以下处理:根据再次递归到的目标组件的显示参数,在用户界面中显示分配给再次递归到的目标组件的原生视图控件。
这里,对虚拟视图树的目标分支中的多个目标组件进行再次递归处理,再次递归处理的顺序与初次递归处理的顺序一致。在再次递归过程中,根据再次递归到的目标组件的显示参数,在用户界面中显示分配给再次递归到的目标组件的原生视图控件。如此,可以将分配的各个原生视图控件有序地放置在用户界面中,保证显示的准确无误。
在一些实施例中,可以通过这样的方式来实现上述的根据分配的原生视图控件确定目标组件的显示尺寸:根据目标组件的组件属性,对分配的原生视图控件进行属性配置处理;确定经过属性配置处理的分配的原生视图控件在显示时所需的显示尺寸,以作为目标组件的显示尺寸;可以通过这样的方式来实现上述的在用户界面中显示分配的原生视图控件:在用户界面中显示经过属性配置处理的分配的原生视图控件。
这里,分配的原生视图控件可能是未配置有属性的初始控件,例如未携带信息的标签控件。因此,可以根据目标组件的组件属性,对分配给目标组件的原生视图控件进行属性配置处理,其中,组件属性可以是在目标程序对象中预先设定的。举例来说,目标组件的组件属性是一段文本,分配的原生视图控件是未携带信息的标签控件,则经过属性配置处理后,可以得到携带有该文本的标签控件。
然后,确定经过属性配置处理的分配的原生视图控件在显示时所需的显示尺寸,以作为目标组件的显示尺寸,其中,经过属性配置处理的分配的原生视图控件最终用于在用户界面中显示。
值得说明的是,某些目标组件可能与所有原生视图控件均不对应,对于这类目标组件,可以根据目标组件的组件属性和默认的显示尺寸来确定该目标组件的最终显示尺寸(这里指用于确定显示参数的显示尺寸)。例如某个目标组件用于显示空格,默认的显示尺寸为1个空格所占的显示尺寸,该目标组件的组件属性为数据值4(表示4个空格),则可以确定出该目标组件的最终显示尺寸为4个空格所占的显示尺寸。
通过上述方式,能够提升确定出的显示尺寸的准确性以及最终显示时的准确性。
在一些实施例中,当目标组件用于调用更新后的响应式数据时,步骤204之后,还包括:通过用户界面接收针对分配的原生视图控件的触发操作;将触发操作作为针对更新后的响应式数据的更新操作。
这里,目标组件可以用于调用更新后的响应式数据,例如更新后的响应式数据用于作为目标组件的入参。在该情况下,目标组件与更新后的响应式数据之间形成了双向同步关系,即目标组件可以依赖于更新后的响应式数据进行显示,同时,目标组件也可以用于对更新后的响应式数据进行再次更新。
例如,在用户界面显示分配的原生视图控件后,可以通过用户界面接收针对分配的原生视图控件的触发操作,并将该触发操作作为针对更新后的响应式数据的更新操作。通过上述方式,提升了数据响应的灵活性,拓宽了应用场景。
如图3B所示,本申请实施例通过分配原生视图控件以及计算显示参数,能够提升显示的准确性和合理性,提升用户体验;同时,对目标组件进行相关计算,相较于对原生视图控件进行相关计算来说,能够节省较多计算量,减少计算资源的消耗。
在一些实施例中,参见图3C,图3C是本申请实施例提供的系统平台中的数据响应方法的一个流程示意图,可以由电子设备执行。在图3C中,图3A示出的步骤102之前(图3C以步骤101之前为例),还可以在步骤301中,建立每个程序对象与至少一个响应式数据之间的订阅关系。
在本申请实施例中,可以预先建立每个程序对象与至少一个响应式数据之间的订阅关系。对于程序对象来说,可以在内部记录订阅的所有响应式数据;对于响应式数据来说,同样可以在内部记录订阅该响应式数据的所有程序对象。
在一些实施例中,可以通过这样的方式来实现上述的建立每个程序对象与至少一个响应式数据之间的订阅关系:针对任意一个程序对象,执行以下任意一种处理:响应于针对任意一个程序对象的订阅配置操作,建立任意一个程序对象与订阅配置操作所配置的响应式数据之间的订阅关系;当满足初始化条件时,运行任意一个程序对象,确定在任意一个程序对象的运行过程中调用的响应式数据,并建立任意一个程序对象与调用的响应式数据之间的订阅关系;其中,初始化条件包括以下任意一种:任意一个程序对象被创建;进入任意一个程序对象被创建后的下一个消息循环。
对于创建的每个程序对象,提供了以下两种方式来建立订阅关系,将进行分别说明。
1)响应于针对程序对象的订阅配置操作,建立该程序对象与订阅配置操作所配置的响应式数据之间的订阅关系。例如,相关人员可以通过实施订阅配置操作,来手动配置订阅关系。该方式无需运行程序对象即可实现订阅关系的配置,能够减少计算资源的消耗。
2)当满足初始化条件时,运行程序对象,确定在该程序对象的运行过程中调用的响应式数据,并建立该程序对象与调用的响应式数据之间的订阅关系。该方式通过对创建的程序对象进行初始化,从而完成订阅关系的自动建立,能够保证建立的订阅关系的准确性,同时减少人力成本。其中,初始化条件可以包括以下任意一种:程序对象被创建(即在程序对象被创建时,立刻运行该程序对象);进入程序对象被创建后的下一个消息循环。可以根据建立订阅关系的紧急程度来选择具体的初始化条件。
上述两种方式可以任选其一应用,能够提升建立订阅关系的灵活性。
在一些实施例中,当响应式数据为模板类数据时,可以通过这样的方式来实现上述的建立每个程序对象与至少一个响应式数据之间的订阅关系:建立每个程序对象与至少一个响应式数据的非模板父类之间的订阅关系;其中,非模板父类用于在至少一个响应式数据更新时,根据建立的订阅关系通知对应的程序对象运行。
在响应式数据为模板类数据的情况下,由于响应式数据进行模板实例化后代码体积会大幅膨胀,因此,为了减小编译后的代码体积,可以将响应式能力放在响应式数据的非模板父类中,例如,建立每个程序对象与至少一个响应式数据的非模板父类之间的订阅关系。其中,响应式能力包括但不限于记录订阅关系、在响应式数据更新时根据订阅关系通知对应的程序对象运行。
如图3C所示,在目标程序对象的运行过程中,还可以在步骤302中,重新建立目标程序对象与更新后的响应式数据之间的订阅关系。
这里,在目标程序对象的运行过程中,还可以重新建立目标程序对象与更新后的响应式数据之间的订阅关系,即实现对订阅关系的更新。如此,可以保证订阅关系的有效性和准确性。
如图3C所示,本申请实施例通过预先建立订阅关系,以及在目标程序对象的运行过程中更新订阅关系,能够实现准确的数据响应。
下面,将说明本申请实施例在实际的应用场景中的示例性应用。本申请实施例提供了一种轻量级的原生跨系统平台的客户端(即应用程序)开发框架,采用各系统平台(如iOS、Android、Windows及macOS等系统平台)皆原生支持的C++语言作为开发语言,不改变系统平台原生底层机制,兼容性好,可以覆盖大部分的底层逻辑和界面开发,本申请实施例提供的开发框架中的代码(对应上文的程序对象)能够在各个系统平台之间共享使用,同时又能够保留原生开发的灵活性,允许各个系统平台在该开发框架的基础上进行任意地定制开发。
为了便于理解,提供了如图5所示的客户端开发框架的示意图,图5中的实线框的模块表示是所有的系统平台共享的,虚线框的模块表示是与各个系统平台相关的,将进行分别说明。
1)共享代码部分。参见图5,共享代码部分包括数据驱动开发、界面布局、界面控件及界面操作四个模块。其中,数据驱动开发模块对其他模块没有依赖,可以独立工作,允许以响应式的方式编写应用程序的逻辑,极大地简化应用程序的状态维护和界面更新。
界面布局模块支持以弹性布局的方式完成布局组件中包含的界面控件(对应上文的组件)的显示参数(例如包括显示尺寸和显示位置)计算,并构建出最终的原生视图树用于显示,其中,原生视图树包括若干个需要显示的原生视图控件。
界面控件模块采用一套与系统平台无关的接口来描述开发应用程序所需的常用界面控件,并借助数据驱动的能力完成数据的绑定和更新。图5中示例性地示出了界面(Page)、标签(Lable)、按钮(Button)、文本框(TextField)等界面控件,可以根据实际应用场景中的需求定义更多的界面控件,其中,界面控件即对应上文的组件。
界面操作模块提供了一套与系统平台无关的接口,支持在本开发框架和原生开发的多个功能模块之间的混合跳转(或称切换)。图5中示例性地示出了几种界面切换操作,包括上下文操作(Context)、推入(Push)、弹出(Pop)、升起(Present)及降下(Dismiss)。
2)系统平台相关部分。参见图5,系统平台相关部分包括平台基础架构及平台原生视图桥接两个模块。其中,平台基础架构模块负责抹平各系统平台之间的差异,为共享代码部分提供一个统一的支持环境,使共享代码部分可以按照系统平台无关的方式开发。抹平各系统平台之间的差异主要集中于消息循环和事件机制两个方面,消息循环和事件机制都是各系统平台本身提供的,本申请实施例是对相关的调用方法进行了封装处理,从而实现对不同系统平台的适配。以消息循环举例,Windows系统平台中使用while GetMessage(),Android系统平台中使用Looper(),iOS/macOS系统平台中使用NSRunLoop(),本申请实施例将各个系统平台的投递消息方法进行了封装处理,统一封装为nextTick()方法,调用这个方法即可向各系统平台的消息循环里添加任务,如传递更新操作的任务,其中,whileGetMessage()、Looper()及NSRunLoop()对应上文的消息程序对象,nextTick()对应上文的封装消息程序对象。
平台原生视图桥接模块负责界面控件模块在各个系统平台中的具体实现,例如可以用于管理各系统平台的原生视图控件,并借助数据驱动的能力来保持原生视图控件中的信息与底层数据的同步。如图5所示,平台原生视图桥接模块可以通过UIKit、Cocoa、AppKit、Android View及Duilib等前端框架来实现,但并不限于此。
接下来,将进一步说明本申请实施例提供的客户端开发框架。
1)数据驱动开发。
数据驱动开发主要涉及的是响应式数据,当响应式数据发生变化时,可以根据开发框架设定的规则触发一系列相关操作,例如会触发运行所有关注该响应式数据的程序对象,而哪些程序对象关注该响应式数据可以由开发框架自动维护。
只读的响应式数据的类型可以定义为Reactive<T>,在其内部数据结构中记录了存在订阅关系的所有订阅者vector<Watcher*>,订阅者即为上文的程序对象。可读写的响应式数据的类型定义为Value<T>,可隐式转换为Reactive<T>使用,其中,隐式转换是指编译器会自动产生转换代码,而不需要开发者显式写出转换代码。只读的响应式数据可以通过readonly(1)来创建,例如“Reactive<int>anInt=readonly(1)”是指创建名称为anInt的只读的响应式数据;可读写的响应式数据可以通过reactive(true)来创建,例如“Value<bool>aBool=reactive(true)”是指创建名称为aBool的可读写的响应式数据,当然,以上仅为示例,创建方式并不限于此。
订阅者表示为Watcher,在创建时需指定一个函数闭包(Closure)作为传入的参数,函数闭包中有对响应式数据进行处理(如求值、修改等)的代码。其中,函数闭包是一个匿名函数,可以捕获外部作用域的变量并在函数内部使用,这里捕获了响应式数据,可在函数内部对其进行求值、修改等操作。
如图6所示,本申请实施例提供的框架在对订阅者进行初始化时,执行订阅者内的函数闭包,确定该函数闭包所捕获的响应式数据,并创建该订阅者与该响应式数据之间的订阅关系,订阅关系的管理即对应图5示出的依赖管理。建立的订阅关系包括两个方面,如图6所示,第一方面是在响应式数据内存放该响应式数据的所有订阅者的名单,即对应上文的vector<Watcher*>;第二方面是在订阅者内存放已订阅的所有响应式数据的名单。值得说明的是,可以在创建订阅者时对订阅者进行初始化,也可以在创建订阅者后的下一个消息循环对订阅者进行初始化。此外,也可以不进行初始化,直接指定初始的订阅关系,例如人为指定。
对于订阅者Watcher来说,可以记录并持有其所有的订阅项shared_ptr<Dep>,其中,Dep表示响应式数据的非模板父类,这样做的原因在于:响应式数据是模板类,进行模板实例化后代码体积会大幅膨胀,因此为了减小编译后的代码体积,将响应式能力放在非模板父类中,其中,响应式能力如记录订阅关系、通知订阅者执行函数闭包等。
在本申请实施例中,还存在一些具有特殊身份的订阅者。举例来说,使用无返回值(可以用return表示返回值)的函数闭包创建的订阅者又称作副作用函数,例如某个副作用函数中的函数闭包的功能是通过std::cout的方式将响应式数据输出到用户界面,以进行显示。
又例如,计算数据具有双重身份,既是订阅者,也是响应式数据,可以隐式转换为Reactive<T>来使用。计算数据内的函数闭包会返回一个值(例如return的值为响应式数据乘以2得到的结果),作为该计算数据的结果,且计算数据可被其他订阅者所订阅。
接下来对数据驱动(数据响应)进行示例性说明。当某个响应式数据发生变化(即响应式数据被更新)时,开发框架会列出该响应式数据当前的所有订阅者,并记录到待执行列表(对应上文的待运行列表)中。然后,在下个消息循环开始前,根据待执行列表中的订阅者的创建顺序对待执行列表中的多个订阅者进行排序处理,从而依次执行订阅者内的函数闭包,其中,排序处理可以是按照创建时间从早到晚的顺序来进行的。在执行订阅者内的函数闭包的同时,更新该订阅者与相应的响应式数据之间的订阅关系(即重新建立订阅关系),保证订阅关系的准确性和实时性,更好地实现数据驱动的能力。
为了便于理解,本申请实施例提供了如图7所示的数据驱动(数据响应)的过程,在图7中,响应式数据A的订阅者包括X和Y,响应式数据B的订阅者包括Y和Z,由于响应式数据A的数据值从1更新为2,因此将订阅者X和Y添加至待执行列表中;同时,由于响应式数据B的数据值从3更新为4,因此将订阅者Y和Z添加至待执行列表中,其中,由于订阅者Y同时订阅了响应式数据A和B,因此,将订阅者Y添加至待执行列表的操作仅执行一次即可。然后,在下个消息循环开始前,依次执行待执行列表中各个订阅者的函数闭包。
值得说明的是,当某个响应式数据不存在任何订阅者时,则可以删除该响应式数据,以节省空间。
2)视图树构建及界面布局的相关流程。
本申请实施例采用虚拟视图树(也称虚拟视图节点树)表达视图结构,在实际显示前会先进行虚拟视图树扁平化,得到实际需要参与界面布局的虚拟视图树,然后再根据虚拟视图树去构建实际的原生视图树,按照设定的布局规则(如弹性布局规则)递归计算各项显示参数,完成界面布局并上屏显示,即显示于用户界面中。本申请实施例提供了如图8所示的界面布局及上屏显示过程的示意图,为了便于理解,将通过以下的伪代码(该伪代码存在于订阅者内的函数闭包,实际应用时可以通过C++语言编写实际代码)为例进行说明:
定义可读写的响应式数据newbie,并初始化数据值为true;
基于上述的伪代码,可以通过开发框架提供的布局组件和界面控件,在用户界面中以系统平台原生的视觉风格及交互效果来显示相应的内容。其中,布局组件仅负责开发框架所定义的组件的布局计算,不与原生视图控件关联,即与系统平台无关;而界面控件(即开发框架所定义的组件)一定会关联原生视图控件,需要各系统平台各自桥接。
举例来说,上述的伪代码在执行之后,会在内存中构建一棵虚拟视图树来表达相应的界面层次结构,在实际显示这个虚拟视图树的过程中,可以执行步骤a)至d)。
a)视图树扁平化。
将伪代码中的循环(如For循环)和条件(如If…Then…Else)进行展开,得到虚拟视图树的多个分支,每个分支包括多个组件。对响应式数据newbie进行求值,根据求取的数据值来筛选出对应分支的组件。此处,newbie的数据值为true,因此,抛弃Else分支(即“否则,执行以下处理”的分支)的Label组件,如此,Row组件(又称根组件)的子组件就包括Then分支(即“当newbie的数据值为true时,执行以下处理”的分支)的Label组件,以及后续的Space组件、Label组件及CheckBox组件。
值得说明的是,图8示出的插槽填充中的插槽是指占位符,用于向开发者提供定制组件内部内容的能力。
b)进入视图复用池。
这里,视图复用池记录有虚拟视图树在本次界面布局前已经在使用的原生视图控件,为了避免重复创建、销毁原生视图控件所导致的资源浪费,因此,可以套用视图复用池中的原生视图控件。值得说明的是,若是上述伪代码首次执行,即首次进行界面布局,则视图复用池为空。此外,虚拟视图树与视图复用池之间可以是一一对应的关系。
c)进行界面布局。
从根组件Row开始执行递归,Row组件无需分配原生视图控件,Row组件的显示参数需要通过其子组件决定,因此,启动循环对Row组件的所有子组件进行界面布局。
循环体内首先是Label组件,从视图复用池里为其分配一个原生视图控件,这里的实现可以依赖平台原生视图桥接模块来进行选择,例如(iOS:UILabel;Android:TextView;Windows:CLabelUI;macOS:NSTextField)。其中,Label组件在iOS系统平台中对应的原生视图控件为UILabel,以此类推。
在完成原生视图控件的分配后,根据Label组件的组件属性对分配的原生视图控件进行属性配置处理,这里,配置的属性包括但不限于文本、字体、字号、文字颜色、行数及文本截断方式。由于上述伪代码中设置的是Label(“Hello”),因此,根据文本“Hello”对分配的原生视图控件进行属性配置处理。这里的实现也可以依赖平台原生视图桥接模块来进行选择,例如(iOS:setText;Android:setText;Windows:SetText,macOS:setStringValue)。
对分配的原生视图控件进行属性配置完成后,计算属性配置后的原生视图控件完整显示所需的显示尺寸,并进行记录。在不同的系统平台中,计算显示尺寸的方式可能存在不同,例如(iOS、macOS:sizeThatFits,Android:measure;Windows:EstimateSize)。
对于循环到的第二个子组件即Space组件来说,不需要分配原生视图控件,该Space组件占据参数(如上述伪代码中设定的参数4)给定的固定尺寸。
对于循环到的第三个子组件即Label组件来说,处理逻辑同第一个Label组件,此处不再详述。
对于循环到的第四个子组件即CheckBox组件来说,允许传递响应式数据newbie,表示该CheckBox组件的状态将与该可读写的响应式数据newbie双向同步。由于当前newbie的数据值为true,因此,复选框的状态为勾选。该CheckBox组件对应的原生视图控件可以依赖平台原生视图桥接模块来进行选择,此处不再详述。
循环完毕,Row组件根据内层四个组件的显示尺寸,按照弹性布局的规则计算每个子组件的显示参数(包括显示尺寸和显示位置),并计算出Row组件自身的显示参数。
Row组件的界面布局计算完成后,再一次执行递归,根据之前记录的显示尺寸,把分配给各个组件的原生视图控件放置在用户界面中对应的地方。
d)离开视图复用池。
将视图复用池中的、本次界面布局过程中未使用的原生视图控件进行回收,即移除出视图复用池,如此,避免无用的原生视图控件占用视图复用池的空间。
值得说明的是,上述的伪代码可以位于一个副作用函数的函数闭包之中。由于在函数闭包中执行了视图树扁平化操作,对newbie进行了求值,因此,该副作用函数就和响应式数据newbie自动建立了订阅关系。在该情况下,若用户触发(这里以点击为例)用户界面中显示的复选框控件(即CheckBox组件对应的原生视图控件),由于CheckBox组件和newbie建立了双向同步关系,操作会使得newbie的数据值发生变化,进而触发该副作用函数的函数闭包在下个消息循环重新执行,完成虚拟视图树的响应式更新,实现有效的数据驱动。
为了便于理解,本申请实施例提供了如图9A、图9B、图9C及图9D所示的用户界面的示意图,在用户界面中显示了文本“Hello World”以及处于勾选状态的复选框控件,若用户通过点击操作取消了复选框控件的勾选,则文本会相应变为“Goodbye World”,从而实现响应式更新。其中,图9A对应iOS系统平台,图9B对应Android系统平台,图9C对应macOS系统平台,图9D对应Windows系统平台,根据示出的用户界面可以确定,采用本申请实施例提供的开发框架,仅需短短数行代码,便可在各大主流系统平台运行,产出适配各系统平台原生样式的可交互用户界面(User Interface,UI),大幅提升开发效率。
综上,本申请实施例至少具有以下技术效果:1)提供了一种原生跨系统平台的客户端开发框架,使用C++语言一次编写代码即可构建适配多个系统平台的原生用户界面,能够大幅提升开发效率,节省人力资源,优化项目成本;2)方案实现本身极其轻量,在一些情况下源代码仅400千字节(KB),无额外第三方依赖,集成使用时无需对现有项目进行任何改造;3)由于是采用系统平台原生支持的编程语言进行开发,因此在将开发的应用程序部署至系统平台后,能够提升应用程序的运行性能;4)利用开发框架开发的应用程序中不需要进行跨语言通信,能够避免胶水代码的出现。
下面继续说明本申请实施例提供的系统平台中的数据响应装置455实施为软件模块的示例性结构,在一些实施例中,如图2所示,存储在存储器450的系统平台中的数据响应装置455中的软件模块可以包括:更新模块4551,用于响应于针对响应式数据的更新操作,对响应式数据进行更新处理;筛选模块4552,用于从多个程序对象中筛选出与更新后的响应式数据存在订阅关系的目标程序对象;其中,每个程序对象均支持在多种系统平台中运行;响应模块4553,用于运行目标程序对象,在运行过程中根据更新后的响应式数据对目标系统平台的原生视图控件进行分配处理,并在用户界面中显示分配的原生视图控件。
在一些实施例中,响应模块4553还用于:在目标程序对象的运行过程中执行以下处理:根据更新后的响应式数据对目标程序对象包括的多个组件进行筛选处理,得到目标组件;将基于目标系统平台创建的、且与目标组件对应的原生视图控件分配给目标组件,并根据分配的原生视图控件确定目标组件的显示尺寸;根据目标组件的显示尺寸进行界面布局处理,得到目标组件的显示参数;其中,目标组件的显示参数包括显示尺寸及显示位置;根据目标组件的显示参数,在用户界面中显示分配的原生视图控件。
在一些实施例中,响应模块4553还用于:从目标程序对象对应的视图复用池中查询目标组件对应的原生视图控件,并将查询到的原生视图控件分配给目标组件;其中,视图复用池用于存储基于目标系统平台创建的、且在目标程序对象的历史运行过程中分配的原生视图控件;删除视图复用池中未分配的原生视图控件。
在一些实施例中,响应模块4553还用于:当视图复用池中不存在目标组件对应的原生视图控件时,基于目标系统平台创建与目标组件对应的原生视图控件,并将创建的原生视图控件分配给目标组件;其中,创建的原生视图控件用于存储至视图复用池中。
在一些实施例中,响应模块4553还用于:根据目标程序对象构建虚拟视图树;其中,虚拟视图树包括多个分支,每个分支包括多个组件,且不同分支对应响应式数据的不同数据值;对更新后的响应式数据进行取值处理,得到目标数据值;在多个分支中筛选出与目标数据值对应的目标分支,并将目标分支中的组件作为目标组件。
在一些实施例中,响应模块4553还用于对目标分支中的多个目标组件进行初次递归处理,并在初次递归过程中执行以下处理:将基于目标系统平台创建的、且与初次递归到的目标组件对应的原生视图控件分配给初次递归到的目标组件。
在一些实施例中,响应模块4553还用于对目标分支中的多个目标组件进行再次递归处理,并在再次递归过程中执行以下处理:根据再次递归到的目标组件的显示参数,在用户界面中显示分配给再次递归到的目标组件的原生视图控件。
在一些实施例中,响应模块4553还用于:根据目标组件的组件属性,对分配的原生视图控件进行属性配置处理;确定经过属性配置处理的分配的原生视图控件在显示时所需的显示尺寸,以作为目标组件的显示尺寸;在用户界面中显示经过属性配置处理的分配的原生视图控件。
在一些实施例中,当目标组件用于调用更新后的响应式数据时,响应模块4553还用于:通过用户界面接收针对分配的原生视图控件的触发操作;将触发操作作为针对更新后的响应式数据的更新操作。
在一些实施例中,系统平台中的数据响应装置455还包括建立模块,用于:建立每个程序对象与至少一个响应式数据之间的订阅关系;响应模块4553还用于:重新建立目标程序对象与更新后的响应式数据之间的订阅关系。
在一些实施例中,建立模块还用于针对任意一个程序对象,执行以下任意一种处理:响应于针对任意一个程序对象的订阅配置操作,建立任意一个程序对象与订阅配置操作所配置的响应式数据之间的订阅关系;当满足初始化条件时,运行任意一个程序对象,确定在任意一个程序对象的运行过程中调用的响应式数据,并建立任意一个程序对象与调用的响应式数据之间的订阅关系;其中,初始化条件包括以下任意一种:任意一个程序对象被创建;进入任意一个程序对象被创建后的下一个消息循环。
在一些实施例中,当响应式数据为模板类数据时,建立模块还用于:建立每个程序对象与至少一个响应式数据的非模板父类之间的订阅关系;其中,非模板父类用于在至少一个响应式数据更新时,根据建立的订阅关系通知对应的程序对象运行。
在一些实施例中,响应模块4553还用于:将目标程序对象添加至待运行列表中;根据待运行列表中的多个目标程序对象的创建顺序,依次运行多个目标程序对象。
在一些实施例中,响应模块4553还用于:对更新后的响应式数据进行函数运算处理,得到返回数据值;其中,返回数据值用于被与目标程序对象存在订阅关系的程序对象调用。
在一些实施例中,系统平台中的数据响应装置455还包括消息循环模块,用于:运行多个程序对象中的封装消息程序对象,以触发目标系统平台中的消息循环;其中,封装消息程序对象是对多种系统平台分别对应的消息程序对象进行封装处理得到的;其中,消息循环用于进行与目标系统平台之间的消息传输,消息循环所传输的消息包括更新操作。
在一些实施例中,分配的原生视图控件对应目标系统平台的原生功能;响应模块4553还用于:响应于针对分配的原生视图控件的触发操作,运行多个程序对象中的功能跳转程序对象,以在用户界面中显示原生功能的执行过程。
本申请实施例提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令(即可执行指令),该计算机指令存储在计算机可读存储介质中。电子设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该电子设备执行本申请实施例上述的系统平台中的数据响应方法。
本申请实施例提供一种存储有可执行指令的计算机可读存储介质,其中存储有可执行指令,当可执行指令被处理器执行时,将引起处理器执行本申请实施例提供的系统平台中的数据响应方法。
在一些实施例中,计算机可读存储介质可以是FRAM、ROM、PROM、EPROM、EEPROM、闪存、磁表面存储器、光盘、或CD-ROM等存储器;也可以是包括上述存储器之一或任意组合的各种设备。
在一些实施例中,可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在计算环境中使用的其它单元。
作为示例,可执行指令可以但不一定对应于文件系统中的文件,可以可被存储在保存其它程序或数据的文件的一部分,例如,存储在超文本标记语言(HTML,Hyper TextMarkup Language)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。
作为示例,可执行指令可被部署为在一个电子设备上执行,或者在位于一个地点的多个电子设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个电子设备上执行。
以上,仅为本申请的实施例而已,并非用于限定本申请的保护范围。凡在本申请的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本申请的保护范围之内。
Claims (15)
1.一种系统平台中的数据响应方法,其特征在于,应用于目标系统平台,所述目标系统平台为多种系统平台中的任意一种;所述方法包括:
响应于针对响应式数据的更新操作,对所述响应式数据进行更新处理;
从多个程序对象中筛选出与更新后的所述响应式数据存在订阅关系的目标程序对象;其中,每个所述程序对象均支持在所述多种系统平台中运行;
运行所述目标程序对象,在运行过程中根据更新后的所述响应式数据对所述目标系统平台的原生视图控件进行分配处理,并
在用户界面中显示分配的原生视图控件。
2.根据权利要求1所述的方法,其特征在于,所述在运行过程中根据更新后的所述响应式数据对所述目标系统平台的原生视图控件进行分配处理,并在用户界面中显示分配的原生视图控件,包括:
在所述目标程序对象的运行过程中执行以下处理:
根据更新后的所述响应式数据对所述目标程序对象包括的多个组件进行筛选处理,得到目标组件;
将基于所述目标系统平台创建的、且与所述目标组件对应的原生视图控件分配给所述目标组件,并根据分配的原生视图控件确定所述目标组件的显示尺寸;
根据所述目标组件的显示尺寸进行界面布局处理,得到所述目标组件的显示参数;其中,所述目标组件的显示参数包括显示尺寸及显示位置;
根据所述目标组件的显示参数,在所述用户界面中显示所述分配的原生视图控件。
3.根据权利要求2所述的方法,其特征在于,所述将基于所述目标系统平台创建的、且与所述目标组件对应的原生视图控件分配给所述目标组件,包括:
从所述目标程序对象对应的视图复用池中查询所述目标组件对应的原生视图控件,并将查询到的原生视图控件分配给所述目标组件;
其中,所述视图复用池用于存储基于所述目标系统平台创建的、且在所述目标程序对象的历史运行过程中分配的原生视图控件;
所述将基于所述目标系统平台创建的、且与所述目标组件对应的原生视图控件分配给所述目标组件之后,所述方法还包括:
删除所述视图复用池中未分配的原生视图控件。
4.根据权利要求2所述的方法,其特征在于,所述根据更新后的所述响应式数据对所述目标程序对象包括的多个组件进行筛选处理,得到目标组件,包括:
根据所述目标程序对象构建虚拟视图树;其中,所述虚拟视图树包括多个分支,每个所述分支包括多个组件,且不同所述分支对应所述响应式数据的不同数据值;
对更新后的所述响应式数据进行取值处理,得到目标数据值;
在所述多个分支中筛选出与所述目标数据值对应的目标分支,并将所述目标分支中的组件作为目标组件。
5.根据权利要求4所述的方法,其特征在于,所述将基于所述目标系统平台创建的、且与所述目标组件对应的原生视图控件分配给所述目标组件,包括:
对所述目标分支中的多个目标组件进行初次递归处理,并在初次递归过程中执行以下处理:
将基于所述目标系统平台创建的、且与初次递归到的目标组件对应的原生视图控件分配给所述初次递归到的目标组件;
所述根据所述目标组件的显示参数,在所述用户界面中显示所述分配的原生视图控件,包括:
对所述目标分支中的多个目标组件进行再次递归处理,并在再次递归过程中执行以下处理:
根据再次递归到的目标组件的显示参数,在所述用户界面中显示分配给所述再次递归到的目标组件的原生视图控件。
6.根据权利要求2所述的方法,其特征在于,所述根据分配的原生视图控件确定所述目标组件的显示尺寸,包括:
根据所述目标组件的组件属性,对所述分配的原生视图控件进行属性配置处理;
确定经过所述属性配置处理的所述分配的原生视图控件在显示时所需的显示尺寸,以作为所述目标组件的显示尺寸;
所述在所述用户界面中显示所述分配的原生视图控件,包括:
在所述用户界面中显示经过所述属性配置处理的所述分配的原生视图控件。
7.根据权利要求2所述的方法,其特征在于,当所述目标组件用于调用更新后的所述响应式数据时,所述在所述用户界面中显示所述分配的原生视图控件之后,所述方法还包括:
通过所述用户界面接收针对所述分配的原生视图控件的触发操作;
将所述触发操作作为针对更新后的所述响应式数据的更新操作。
8.根据权利要求1至7任一项所述的方法,其特征在于,所述从多个程序对象中筛选出与更新后的所述响应式数据存在订阅关系的目标程序对象之前,所述方法还包括:
建立每个所述程序对象与至少一个响应式数据之间的订阅关系;
当在运行过程中根据更新后的所述响应式数据对所述目标系统平台的原生视图控件进行分配处理时,所述方法还包括:
重新建立所述目标程序对象与更新后的所述响应式数据之间的订阅关系。
9.根据权利要求8所述的方法,其特征在于,所述建立每个所述程序对象与至少一个响应式数据之间的订阅关系,包括:
针对任意一个程序对象,执行以下任意一种处理:
响应于针对所述任意一个程序对象的订阅配置操作,建立所述任意一个程序对象与所述订阅配置操作所配置的响应式数据之间的订阅关系;
当满足初始化条件时,运行所述任意一个程序对象,确定在所述任意一个程序对象的运行过程中调用的响应式数据,并建立所述任意一个程序对象与所述调用的响应式数据之间的订阅关系;
其中,所述初始化条件包括以下任意一种:所述任意一个程序对象被创建;进入所述任意一个程序对象被创建后的下一个消息循环。
10.根据权利要求8所述的方法,其特征在于,当所述响应式数据为模板类数据时,所述建立每个所述程序对象与至少一个响应式数据之间的订阅关系,包括:
建立每个所述程序对象与至少一个响应式数据的非模板父类之间的订阅关系;
其中,所述非模板父类用于在所述至少一个响应式数据更新时,根据建立的所述订阅关系通知对应的所述程序对象运行。
11.根据权利要求1至7任一项所述的方法,其特征在于,所述从多个程序对象中筛选出与更新后的所述响应式数据存在订阅关系的目标程序对象之后,所述方法还包括:
将所述目标程序对象添加至待运行列表中;
当所述目标程序对象的数量为多个时,所述运行所述目标程序对象,包括:
根据所述待运行列表中的多个所述目标程序对象的创建顺序,依次运行多个所述目标程序对象。
12.根据权利要求1至7任一项所述的方法,其特征在于,所述方法还包括:
运行所述多个程序对象中的封装消息程序对象,以触发所述目标系统平台中的消息循环;
其中,所述封装消息程序对象是对所述多种系统平台分别对应的消息程序对象进行封装处理得到的;
其中,所述消息循环用于进行与所述目标系统平台之间的消息传输,所述消息循环所传输的消息包括所述更新操作。
13.一种系统平台中的数据响应装置,其特征在于,应用于目标系统平台,所述目标系统平台为多种系统平台中的任意一种;所述装置包括:
更新模块,用于响应于针对响应式数据的更新操作,对所述响应式数据进行更新处理;
筛选模块,用于从多个程序对象中筛选出与更新后的所述响应式数据存在订阅关系的目标程序对象;其中,每个所述程序对象均支持在所述多种系统平台中运行;
响应模块,用于运行所述目标程序对象,在运行过程中根据更新后的所述响应式数据对所述目标系统平台的原生视图控件进行分配处理,并在用户界面中显示分配的原生视图控件。
14.一种电子设备,其特征在于,包括:
存储器,用于存储可执行指令;
处理器,用于执行所述存储器中存储的可执行指令时,实现权利要求1至12任一项所述的系统平台中的数据响应方法。
15.一种计算机可读存储介质,其特征在于,存储有可执行指令,用于被处理器执行时,实现权利要求1至12任一项所述的系统平台中的数据响应方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110904099.8A CN115705212A (zh) | 2021-08-06 | 2021-08-06 | 系统平台中的数据响应方法、装置及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110904099.8A CN115705212A (zh) | 2021-08-06 | 2021-08-06 | 系统平台中的数据响应方法、装置及电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115705212A true CN115705212A (zh) | 2023-02-17 |
Family
ID=85178530
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110904099.8A Pending CN115705212A (zh) | 2021-08-06 | 2021-08-06 | 系统平台中的数据响应方法、装置及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115705212A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117389615A (zh) * | 2023-12-12 | 2024-01-12 | 山东科技大学 | 一种工业控制板的程序重构方法 |
-
2021
- 2021-08-06 CN CN202110904099.8A patent/CN115705212A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117389615A (zh) * | 2023-12-12 | 2024-01-12 | 山东科技大学 | 一种工业控制板的程序重构方法 |
CN117389615B (zh) * | 2023-12-12 | 2024-03-01 | 山东科技大学 | 一种工业控制板的程序重构方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108062252B (zh) | 一种信息交互方法、对象管理方法及装置和系统 | |
CN110109659A (zh) | 一种实现前端应用脚手架的系统和服务器 | |
US8839192B2 (en) | System and method for presentation of cross organizational applications | |
CN110362363B (zh) | 一种基于运行时模型实现对终端应用控制的方法 | |
CN103631664A (zh) | 一种进程间的通信方法和装置 | |
CN107656729A (zh) | 列表视图的更新装置、方法及计算机可读存储介质 | |
CN112988185A (zh) | 云应用更新方法、装置、系统、电子设备及存储介质 | |
CN113296758A (zh) | 一种前端组件库构建方法、装置及存储介质 | |
CN112363714A (zh) | 一种服务组合模型的开发方法、装置、存储介质及设备 | |
CN115705212A (zh) | 系统平台中的数据响应方法、装置及电子设备 | |
CN110659020A (zh) | 用于在多仓库环境下动态构建项目架构的实现方法、操作方法及装置 | |
CN110532045A (zh) | 一种跨进程调用方法及相关装置 | |
CN113656001A (zh) | 平台组件开发方法、装置、计算机设备及存储介质 | |
CN103631645A (zh) | 一种基于数字医疗的数字家庭中间件系统 | |
CN113448650A (zh) | 直播功能插件加载方法、装置、设备及存储介质 | |
CN112214325A (zh) | Fpga任务动态编排方法、装置、芯片和存储介质 | |
CN110045997B (zh) | 基础功能模块的对象初始化方法、装置、设备和存储介质 | |
WO2023124657A1 (zh) | 微应用的运行方法、装置、设备、存储介质及程序产品 | |
CN109144750B (zh) | 一种消息处理方法、装置、电子设备及存储介质 | |
CN115829826A (zh) | 模型存储优化方法及电子设备 | |
CN109542437A (zh) | 一种基于Linux嵌入式浏览器的HMI开发方法 | |
CN111124386B (zh) | 基于Unity的动画事件处理方法、装置、设备和存储介质 | |
CN115686733A (zh) | 一种服务的部署方法、装置、电子设备及存储介质 | |
CN110347448B (zh) | 一种构造终端应用行为的运行时模型的方法 | |
CN112306539A (zh) | 一种单片机应用层开发方法、系统、终端及介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 40081844 Country of ref document: HK |