IOS开发学习笔记(十九)——Core Data使用(上篇)

【信息科学与工程学】【数据中心】 第十九篇 MFU的优化提升方法03 等级模块类型子模块子子模块功能描述MFU影响因子优化优先级L0​算术逻辑单元(ALU)标量ALU整数ALU标量整数运算α_int = 0.1-0.3中浮点ALU标量浮点运算α_fp_scalar = 0.2-0.4中向量处理单元(VPU)SIMD单元128-bit SIMD短向量运算β_SIMD128 = 0.3-0.6高256-bit SIMD中向量运算β_SIMD256 = 0.4-0.7高512-bit SIMD长向量运算β_SIMD512 = 0.5-0.8极高矩阵处理单元(MPU)Tensor C 阅读详情

本小节主要讲述Core Data相关方面的知识,以及如何使用。


Core Data基础知识

官方的说法是:Core Data is a schema-driven object graph management and persistence framework.

翻译过来的意思大概是:Core Data是一个模式驱动的对象图管理和持久化框架。

好吧,上面的字面意思不是很容易理解,那么我们从以下几个方面来帮助那些有其余开发经验的程序员树立一些观念:

  1. Core Data不是一个数据库,但是他可能使用一个数据库。默认情况下,Core Data将使用SQLite,但是你可以完全不用关心任何关系型数据库相关知识,或者SQL语句;
  2. Core Data不是一个类似于Hibernate的对象关系映射框架。Core Data仅仅是一个对象间的关系模型,用户无需数据库知识,并且数据也不一定保存在数据库中;
  3. Core Data允许你去保存模型对象到文件中并且可以在需要的时候取回数据,这一系列操作类似于打包和序列化操作,但是Core Data能够做的更多;

Core Data能够做的比较强大的功能包括:

  1. Core Data提供了维护模型对象变化的基础能力,这样你可以执行撤销和重做操作,并且Core Data可以维护对象间的相互关系;
  2. Core Data允许你在给定时间内在内存中保留模型对象的一个子集,这对于严苛的iOS内存环境相当重要;
  3. 使用Schema来描述模型对象。你可以在一个图形化的编辑器中定义你的模型的主要特性,甚至可以包含各个对象间的关系。这样提供了一个简单的手段来保证一个基本的健壮性,例如可以设置缺省值和属性值的验证;
  4. 允许你维护对象的不想交集合。例如,允许你在一个视图中对对象进行编辑,但这个内容可能被丢弃,导致另一个视图中不更新对象;
  5. 对对象的版本管理操作提供支持,这样可以很方便的将旧版对象升级为新版对象;

Core Data不是一个单独的类,而是一群需要互相协作的类的集合。整个Core Data的架构图是比较复杂的:


实例

MyCoreData

  1. 建立一个新的Empty工程,名字叫MyCoreData,工程属性选择Core Data和ARC支持;
  2. 在继续下一步之前,我们了解几个内容:

    • Managed Object Model,描述了你将在App中使用的Schema。如果你有数据库背景知识,你可以想象一下数据库的Schema。这里的Schema实际上指的是一个对象(或者说实体)的集合。在XCode中,模型被保存在.xcdatamodeld文件中。你可以使用可视化的编辑器来定义实体、属性、关系等;
    • Persistent Store Coordinator,在iOS中默认使用SQLite存储持久化数据,当然Core Data提供了存储不同实体到不同存储对象的手段。PSC就是对存储手段进行维护的管理器。当然你完全可以忘记这个对象,因为你基本上不需要和他直接交互;
    • Managed Object Context,这个对象用于管理对象的序列化和反序列化工作,也是在使用Core Data Stack时主要使用的工具;
    • 整理下可以发现,从底层往上的顺序分别是:DataStore->Persistent Object Store->Persistent Store Coordinator->Managed Object Context->App;

  3. 基本概念讲完了,我们点击项目生成的.xcdatamodel文件,点击Add Entity,添加一个实体,名字叫Novel;


  4. 添加属性,定义如下的三个属性值:


  5. 创建用户界面,在File->New中创建一个StoryBoard,然后在Project属性中设置为这个Story Board;
  6. 在AppDelegate.m文件中,将自动生成的didFinishLaunchingWithOptions方法的实现清空,变为:
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        return YES;
    }

  7. 在Story Board编辑界面中,添加一个Table View Controller、一个View Controller,设置Table View Controller跳转到View Controller(注意选择Segue的Modal,因为后面使用dismissViewController来释放Details窗口),并且Embed in到Navigator View Controller;
  8. 在Table View Controller中添加一个Button,并且选择Button的Identifier为Add,使之变成一个加号按钮;
  9. 选择Table View的Cell,将其Style修改为Right Detail;
  10. 去那个名为Details的View Controller,先放置一个Navigation Bar到界面上面,然后拖动两个Button到Navigation Bar上面,并且分别设置对应的Bar Button Item的Identifier属性为Cancel和Save,如下:

  11. 在Details界面中添加三个text field,并且分别设置他们的placeholder属性为:name、author、version;
  12. ListView上面的那个加号按钮在点击时需要跳转到Details界面,所以需要在Story Board上选择这个按钮,按住Control键,拖动到Details这个View之上后释放鼠标,选择Segue->Modal;
  13. 在源代码文件夹中创建一个Object-C类,命名为NovelListViewController,父类选择UITableViewController;
  14. 在Story Board中,将Table View的Class设置为NovelListViewController;

  15. 同样,设置Details这个View的Class为新建立的NovelDetailsViewController;
  16. 在NovelDetailsViewController中生成和界面中的TextField对应的控件变量及响应方法:
    #import <UIKit/UIKit.h>
    
    @interface NovelDetailsViewController : UIViewController
    @property (strong, nonatomic) IBOutlet UITextField *tfName;
    @property (strong, nonatomic) IBOutlet UITextField *tfAuthor;
    @property (strong, nonatomic) IBOutlet UITextField *tfVersion;
    
    - (IBAction)cancel:(id)sender;
    - (IBAction)save:(id)sender;
    @end
    

  17. 接下来进入正题,我们将进入操作Core Data的阶段。我们将要实现的主要功能包括:在Details页面中保存数据,在List页面中将数据取回;
  18. 在NovelDetailsViewController.m中加入代码:
    - (NSManagedObjectContext *)managedObjectContext {
        NSManagedObjectContext *context = nil;
        id delegate = [[UIApplication sharedApplication] delegate];
        if ([delegate performSelector:@selector(managedObjectContext)]) {
            context = [delegate managedObjectContext];
        }
        return context;
    }

  19. 记得我们当时对工程添加Core Data支持的时候,我们的AppDelegate中自动添加了一个Managed Object Context,我们将使用这个Context来保存或者取回对象;
  20. 我们将两个按钮的事件处理方法变为:
    - (IBAction)cancel:(id)sender {
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    
    - (IBAction)save:(id)sender {
        // get Managed Object Context
        NSManagedObjectContext *context = [self managedObjectContext];
        
        // Create a new managed object
        NSManagedObject *newNovel = [NSEntityDescription insertNewObjectForEntityForName:@"Novel" inManagedObjectContext:context];
        [newNovel setValue:self.tfName.text forKey:@"name"];
        [newNovel setValue:self.tfAuthor.text forKey:@"author"];
        [newNovel setValue:self.tfVersion.text forKey:@"version"];
        
        NSError *error = nil;
        // Save the object to persistent store
        if (![context save:&error]) {
            NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
        }
        
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    当点击Cancel按钮的时候,我们使用一个动画方式将Details窗口关闭掉。
    当点击Save按钮的时候,我们首先获取Context,然后创建一个新的Managed Object,设置novel的属性,接着调用context的save来存储数据,最后关闭界面。
  21. 现在我们看如何获取列表。我们在TableViewController中添加一个数组用来保存Novel的列表:
    #import <UIKit/UIKit.h>
    
    @interface NovelListViewController : UITableViewController
    
    @property(strong, nonatomic) NSMutableArray *novelList;
    
    @end
    

  22. 同样对于List页面需要添加获取Context和加载时获取数组元素列表接口:
    @implementation NovelListViewController
    
    @synthesize novelList;
    
    - (NSManagedObjectContext *)managedObjectContext
    {
        NSManagedObjectContext *context = nil;
        id delegate = [[UIApplication sharedApplication] delegate];
        if ([delegate performSelector:@selector(managedObjectContext)]) {
            context = [delegate managedObjectContext];
        }
        return context;
    }
    
    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
        
        // Fetch the devices from persistent data store
        NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Novel"];
        self.novelList = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
        
        [self.tableView reloadData];
    }
    

  23. 接下来改造List界面的表格显示模块:
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
    #warning Potentially incomplete method implementation.
        // Return the number of sections.
        return 1;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
    #warning Incomplete method implementation.
        // Return the number of rows in the section.
        return self.novelList.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
        
        // Configure the cell...
        NSManagedObject *device = [self.novelList objectAtIndex:indexPath.row];
        [cell.textLabel setText:[NSString stringWithFormat:@"%@ %@", [device valueForKey:@"name"], [device valueForKey:@"version"]]];
        [cell.detailTextLabel setText:[device valueForKey:@"author"]];
        
        return cell;
    }
    注意在Story Board中设置Table View Cell的Identifier属性值为Cell,与代码中的保持一致。
  24. 至此,程序功能全部完成,查看发现数据能够正常保存,但我们没有写一行和数据库相关的代码。










【信息科学与工程学】【产品体系】计算机科学与自动化——第一百八十九篇 操作系统内核(微内核/宏内核)函数与算法02 宏内核(Linux)更多典型内核函数/算法,从编号271开始,覆盖中断管理、热插拔、PCI、ACPI、固件、崩溃转储、kexec、休眠、watchdog、RTC、hwmon、LED、backlight、input子系统、remoteproc等更多领域。编号类型领域内核类型内核中的函数/算法/模块/模组模块的调用关系模块/函数/算法逐步推理思考的数学表达式及参数列表及参数数值设计模块的C/C++/其他代码关联知识271中断管理中断描述符宏内核 / (中断子系统核心)驱动申请中断 → → → 分配irq_ 阅读详情

相关推荐

【信息科学与工程学】【解决方案体系】【系统工程】 第三十五篇 AI + ICT + 云计算 + 网络解决方案​ 的软件配置清单01

AI + ICT + 云计算 + 网络解决方案​ 的软件配置清单。需要说明:结合当前主流通用 CAE、数学建模、AI 框架、云原生与网络仿真工具整理出的推荐软件栈。软件 / 平台功能说明Kubernetes (K8s)​容器编排,承载 AI 训练、仿真任务调度、微服务化网络功能(CNF)OpenStack / 云管平台​私有云 IaaS 底座,提供虚拟机、GPU 算力、VPC 网络Slurm / Altair PBS​HPC 集群作业调度,支撑大规模电磁 / CFD / 光子仿真Docker / Singu

weixin_49199313的博客 407

iOS应用数据存取之数据库存储-----Core Data

最近在看这方面的内容,这篇资料比较好懂,可以对core data有个大概的认识,推荐给大家。 原文地址:http://my.oschina.net/panyong/blog/191202 OS应用数据存取的常用方式有如下几种  XML属性列表 —— PList  NSKeyedArchiver 归档  Preference(偏好设置)  SQLite3  Core Data

AliceJi的专栏 508

Swift利用CoreData实现一个通讯录存储详解

主要给大家介绍了关于Swift利用CoreData实现一个通讯录存储的相关资料,本文是大家学习coreDate的基础问题,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。

最全iOS数据存储方法介绍:FMDB,SQLite3 ,Core Data,Plist,Preference偏好设置,NSKeyedArchiver归档...

转载请注明本文地址:http://www.jianshu.com/p/e88880be794f 目的 项目准备运用的Core Data进行本地数据存储,本来打算只写一下Core Data的,不过既然说到了数据存储,干脆来个数据存储基础大总结!本文将对以下几个模块进行叙述。 沙盒 Plist Preference偏好设置 NSKeyedArchiver归档 / NSKeyedUnarchiver...

weixin_33835103的博客 367

保姆级教程:从WOS下载文献到Citespace出图,手把手搞定科研可视化(附避坑指南)

本文提供从WOS下载文献到Citespace出图的完整科研可视化指南,涵盖数据采集、清洗、环境配置和可视化优化全流程。特别分享WOS检索技巧、数据清洗方法和Citespace参数设置,帮助科研新手高效生成专业图谱,避开常见技术陷阱。

weixin_29311017的博客 172

Cursor聊天记录迁移工具:实现跨设备AI对话同步与备份

在软件开发中,数据持久化与迁移是常见需求,尤其当工具依赖本地存储时。SQLite作为轻量级关系型数据库,因其嵌入式、零配置特性,常被用于存储应用状态与用户数据。其WAL(预写式日志)模式提升了并发性能,但也增加了数据操作复杂性。通过命令行工具与JSON序列化技术,可以实现结构化数据的提取、转换与安全迁移,这对于保障开发资产的连续性与可移植性具有重要价值。例如,在AI辅助编程场景下,开发者与AI的对话记录包含关键的问题分析、解决方案与决策逻辑,是重要的上下文资产。cursor-chat-transfer工具正

weixin_42551967的博客 533

CoreDate使用简介。

1、新建工程,记得勾选Use Core Data 2、建立好以后可以看到xxx.xcdatamodeld,在这里可以添加实体和实体的属性。需要注意的是:实体名字必须以大写开头。 3、然后新建一个file,记得是NSManagedObject cubclass 6、next以后我们就可以看到建立好的实体是有4个文件,如图一

a_ellisa的博客 435

保姆级教程:手把手教你为STM32F407和W25Q128制作Keil MDK的SPI Flash下载算法(FLM文件)

本文提供了一份详细的教程,指导开发者如何为STM32F407和W25Q128制作Keil MDK的SPI Flash下载算法(FLM文件)。从理解下载算法的核心机制到实现FlashPrg.c的核心操作,再到链接脚本与地址映射实战,手把手教你完成定制化SPI Flash下载算法的开发与优化。

weixin_28716769的博客 408

CoreData初次实践(一)

今天我们来通过创建一个小的Demo来实践我们的CoreDate 的学习。参考书籍Core_Data_by_Tutorials 初始项目 更多关于CoreDate的基础知识 二 创建Core Data Stack 主要一下几个步骤: NSManagedObjectModel NSPresistentStore NSPersistentSt...

weixin_33858249的博客 175

Android安全支付(1)-整体架构-keymint

(1)接口定义hardware/interfaces/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl。keymint是keymaster v4之后的替代设计。所以android 15上最好采用keymint的接口进行硬件功能的对接。同时,我们会集成一款紫光的芯片。3.可以用keyStore.getKey()来获取存储在keyStore中的数据进行加密和解密。四、关于keymint的接口定义和具体实现。

Android系统开发-VR OS-系统安全隐私 1767

MacBook用户必看:用Homebrew一键搞定frp内网穿透(含阿里云配置模板)

本文为MacBook用户提供基于Homebrew的frp内网穿透实战指南,详细介绍了从环境准备到阿里云服务器配置的全过程。通过Homebrew一键安装frp客户端,结合阿里云配置模板,实现高效稳定的内网穿透,适用于远程开发、IoT设备调试等多种场景。

weixin_28692817的博客 321

IOS15 编程初学者指南(五)

Core Data 是苹果将应用数据保存到设备的一种机制。它提供持久性、撤销/重做、后台任务、视图同步、版本控制和迁移。你可以使用 Xcode 的数据模型编辑器定义数据类型和关系,Core Data 将自动生成数据类型的类定义。然后,Core Data 可以根据类定义创建和管理对象实例。重要提示你可以通过这个链接了解更多关于核心数据的信息:developer.apple.com/documentation/coredata。描述应用类型,包括它们的属性和关系。一个用于根据。

龙哥盟 938

Ubuntu系统等保3级配置核查与加固

虽然这种方法在某些老旧的系统中仍然有效,但现代Linux发行版通常不推荐使用hosts.deny和hosts.allow文件来管理防火墙规则,因为它们的功能已经被更现代的防火墙管理工具(如iptables或firewalld)所取代。如果你想禁止特定的环境变量,可以从这个列表中移除它们,或者如果你想完全阻止所有环境变量的传递,可以将其设置为空。你可以通过ssh-keygen生成密钥对,并将公钥添加到用户的~/.ssh/authorized_keys文件中。修改配置后,需要重启SSH服务以使更改生效。

悦分享 183

IOS15 编程初学者指南(一)

欢迎来到 iOS 15 编程入门。本书是 iOS 编程入门系列的第六版,已全面更新以支持 iOS 15、macOS 12.0 Monterey 和 Xcode 13。在本书中,您将构建一个名为Let’s Eat的餐厅预订应用程序。您将从探索 Xcode 开始,这是苹果的编程环境,也称为其集成开发环境(IDE)。接下来,您将开始学习 Swift 的基础知识,这是 iOS 应用程序中使用的编程语言,并了解它是如何用于完成常见编程任务的。在您掌握了 Swift 的坚实基础之后,您将开始创建Let’s Eat应用程

龙哥盟 1023

XRoboToolkit —— 基于 PICO 4 Ultra 的机器人遥操作方案(一)

视觉-语言-动作模型(Vision-Language-Action models)的快速发展催生了对大规模、高质量机器人演示数据集的迫切需求。尽管遥操作是数据采集的主要方法,但现有方法存在可扩展性有限、设置流程复杂以及数据质量不佳等问题。本文提出XRoboToolkit,这是一个基于OpenXR标准的跨平台扩展现实(XR)机器人遥操作框架。该系统具备低延迟立体视觉反馈、基于优化的逆运动学算法,并支持多种跟踪模态,包括头部、控制器、手部及辅助运动追踪器。

2506_90492529的博客 3308

DataCastle-租金预测

ID:编号;时间:房屋信息采集的时间;小区名:房屋所在小区,已脱敏处理;小区房屋出租数量:小区出租房屋数量,已脱敏处理;楼层:0、1、2分别表示楼层低,中,高;总层数:房屋所在建筑的总楼层数,已脱敏处理;房屋面积:房屋面积数值,已脱敏处理;房屋朝向:房屋的朝向;居住状态:房屋的居住状态,表示是否已出租或居住中,已脱敏处理;卧室数量:户型信息,数字表示卧室的个数;卫的数量:户型信息,数字表示卫生间的个数;厅的数量:户型信息,数字表示厅的个数;

优快云 精品推荐 3457

AppCoda Beginning IOS8 Programming With Swift

AppCoda Beginning IOS8 Programming With Swift从今天开始要阅读这本书 ,还有下一本Intermediate ios programming with Swift 因为 Swift 相关IOS国内的书籍比较少只能啃英文的了 。第一本书比较基础 ,第二本书中级 。本着为人民服务的态度 ,我是非常想翻译后放博客的 ,但由于两本书内容太多。我不清楚自己能否坚持下去

1920

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

精通 IOS14 编程(一)

iOS 开发环境已经显著成熟,随着苹果用户在 App Store 上花费更多金钱,为专业 iOS 开发者提供了大量的开发机会。然而,掌握 iOS 开发以及 iOS 14 的新特性并非易事。本书将帮助你顺利、轻松地完成这一转变。借助 Swift 5.3,你不仅将学习如何为 iOS 14 编程,还将学习如何编写高效、可读性和可维护性强的 Swift 代码,并保持行业最佳实践。精通 iOS 14 编程将帮助你构建实际的应用程序,并反映实际的开发流程。

龙哥盟 573

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IOS15 编程初学者指南(三)

在本章中,您详细学习了 MVC 设计模式和集合视图控制器。然后,您重新审视了在探索和餐厅列表屏幕中使用的集合视图,并学习了它们是如何工作的。您现在应该理解了 MVC 设计模式、如何创建集合视图控制器以及如何使用集合视图数据源协议。这将使您能够为您的应用程序实现集合视图控制器。到目前为止,您已经为实例设置了视图和视图控制器,以便它可以通过探索屏幕中的集合视图进行显示。在本章中,你向项目中添加了一个属性列表文件,。你实现了结构,它是的模型对象,用于从读取数据,将数据放入实例的数组中,并将其提供给。你为。

龙哥盟 843

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【Bluetooth-SIG】【CoreV6.2】【Vol3 Part G】【GATT】【十九】【Configured Broadcast:把 Characteristic Value 放进广播数据】

文章摘要 本文介绍了蓝牙规范中Configured Broadcast机制,它允许Client通过Server Characteristic Configuration Descriptor(SCCD)配置Server,将特定的Characteristic Value放入LE广播数据中。关键点包括: 仅支持LE物理链路,不支持BR/EDR Client通过设置SCCD的Broadcast bit来配置 广播数据以Service Data Advertising Data类型发送 相比连接方式更高效,适合广播

奔跑吧 android 的博客 374

iOS Vision框架深度解析:从核心原理到智能文档扫描实战

计算机视觉作为人工智能的关键分支,旨在赋予机器“看懂”图像与视频的能力。其核心原理涉及图像处理、特征提取与模式识别,通过算法将像素数据转化为结构化信息。在移动开发领域,设备端视觉技术因其低延迟、高隐私保护特性而极具价值,广泛应用于人脸识别、文本提取、AR交互等场景。苹果Vision框架正是这一技术的杰出代表,它将复杂的神经网络模型封装为简洁API,并深度集成神经引擎以实现高效能计算。本文聚焦Vision框架的实战应用,详细解析如何构建稳健的图像分析管道,并重点演示如何通过矩形检测、透视校正与文本识别的组合,

weixin_30512043的博客 354

iOS进度条深度解析:从UIProgressView到状态感知进度组件

进度条是移动端最基础的反馈控件之一,其本质是将异步任务的完成比例转化为用户可感知的视觉与听觉信号。它依赖Core Animation的时间函数实现平滑插值,受主线程调度、CALayer渲染机制及UIKit无障碍协议共同约束。在深色模式适配、列表复用场景、分段式状态表达等工程实践中,原生UIProgressView暴露了单向性、连续性与标量语义的底层契约限制。本文围绕progress值更新时机、动态颜色响应、动画中断治理、Accessibility语义增强等关键技术点,结合金融类App真实埋点数据,系统阐述如

417

从 Android 组件化到 KMP 跨平台底座(二):Flutter 也是跨平台,为什么还要学习 KMP + CMP?

本文深入探讨了Flutter、Kotlin Multiplatform(KMP)和Compose Multiplatform(CMP)三种跨平台技术的定位与组合方案。文章指出,Flutter提供完整的跨平台应用开发体系(Dart+Widget),KMP专注于共享Kotlin业务逻辑,而CMP是基于KMP的UI共享方案。关键要点包括: 技术定位差异:Flutter适合统一开发整个应用,KMP适合渐进式共享业务底座,CMP实现ComposeUI跨平台 组合可能性:KMP+Flutter(业务+UI分离)、KMP

Mark Wu 的博客 1032

从 Android 组件化到 KMP 跨平台底座(三):KMP 项目结构一次讲清,commonMain、androidMain、iosMain 到底放什么?

本文针对Android开发者首次接触KMP项目时的常见困惑,系统性地讲解了KMP项目结构的核心概念。文章首先通过目录结构引出疑问,然后从Android Module思维出发,逐步阐释KMP中Module、Target和SourceSet三个关键概念及其相互关系。重点分析了commonMain、androidMain和iosMain等SourceSet的职责边界,说明了各SourceSet适合放置的代码类型和依赖关系,并通过大量实例展示了平台差异代码的组织方式。文章还澄清了expect/actual机制的使用

Mark Wu 的博客 716

JAVA笔记-SpringBoot的使用

一、@Resource和@AutoWried @Resource和@Autowired注解都是用来实现依赖注入的。只是@AutoWried按by type自动注入,而@Resource默认按byName自动注入 @Resource有两个重要属性,分别是name和type spring将name属性解析为bean的名字,而type属性则被解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,如果使用type属性则使用byType的自动注入策略。如果都没...

Bonrui编程路 1181

从 Android 组件化到 KMP 跨平台底座(四):KMP 的本质——公共业务逻辑 + 平台差异实现

摘要 KMP跨平台开发的核心在于合理划分代码层级:将纯业务逻辑放在公共层(commonMain),平台相关代码留在各自平台层。判断代码归属的关键标准是是否存在平台依赖:不依赖平台的模型、逻辑直接放入commonMain;简单平台差异使用expect/actual;复杂能力通过接口抽象;强平台特性则完全留在平台层。设计时应保持单向依赖关系,公共层定义抽象接口,平台层提供具体实现,通过依赖注入连接。典型场景如扫码功能应拆分为平台层负责扫描、公共层处理解析,避免过度抽象UI组件和生命周期相关代码。KMP的本质不是

Mark Wu 的博客 589
上一篇: IOS开发学习笔记(十八)——使用地理位置及地图(下篇)
下一篇: IOS开发学习笔记(二十)——Core Data使用(中篇)
Soloman
博客等级 码龄25年 171粉丝 159原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值