IOS热门面试题一
GCD(Grand Central Dispatch)是什么?如何在iOS中使用它?
GCD(Grand Central Dispatch)是什么?
GCD(Grand Central Dispatch)是苹果公司开发的一套多线程编程的API,旨在简化多线程编程的复杂性。它是一个基于任务队列的并发模型,允许开发者将任务提交给系统,系统会自动管理线程的创建、销毁和调度,以实现最佳的性能和资源利用率。GCD特别适用于需要执行并行任务、异步网络请求、定时任务等场景,是iOS和macOS等苹果操作系统中广泛使用的多线程解决方案。
GCD在iOS中的使用
在iOS中使用GCD,主要涉及到创建队列、将任务添加到队列中,以及指定任务的执行方式(同步或异步)。以下是GCD在iOS中的基本使用步骤和要点:
1. 创建队列
GCD中的队列分为串行队列(Serial Dispatch Queue)和并行队列(Concurrent Dispatch Queue)两种类型。
- 串行队列:每次只能执行一个任务,等待当前任务执行完毕后才能执行下一个任务。
- 并行队列:可以同时执行多个任务,任务之间的执行顺序不保证,具体取决于系统的调度策略。
在iOS中,可以通过dispatch_queue_create函数创建自定义队列,或者使用系统提供的全局队列(dispatch_get_global_queue)和主队列(dispatch_get_main_queue)。
2. 添加任务到队列
将任务添加到队列中,GCD会自动安排任务的执行。任务是通过Block(闭包)的形式提交的。
- 同步执行:使用
dispatch_sync函数。在同步执行模式下,当前线程会阻塞,直到队列中的任务执行完毕。如果同步执行任务被添加到当前线程所在的队列,将会导致死锁。 - 异步执行:使用
dispatch_async函数。在异步执行模式下,当前线程不会阻塞,可以继续执行后续代码。异步执行是GCD中最常用的执行方式。
3. 示例代码
以下是一个简单的示例,展示了如何在iOS中使用GCD执行异步任务:
// 创建一个并行队列
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)// 异步执行任务
concurrentQueue.async {// 这里是任务代码,会在新的线程中执行print("任务执行中,当前线程:\(Thread.current)")// 模拟耗时操作DispatchQueue.sleep(for: 2)// 可以在这里执行UI更新等操作,但通常不推荐在后台线程直接更新UI// 如果需要更新UI,应该使用dispatch_async(dispatch_get_main_queue(), ^{...})将任务添加到主队列执行
}// 当前线程继续执行后续代码,不会被阻塞
print("任务已添加到队列,当前线程继续执行:\(Thread.current)")
4. 注意事项
- 死锁:同步执行时,如果任务被添加到了当前线程所在的队列,将会导致死锁。因此,通常不推荐在主线程或当前线程所在的队列中使用同步执行。
- 线程安全:虽然GCD提供了线程安全的API,但在访问共享资源时仍需注意线程安全问题,如使用锁(
NSLock、@synchronized等)或其他同步机制来保护共享资源。 - 性能优化:合理使用GCD的队列和任务调度策略,避免创建过多的线程和队列,以减少上下文切换的开销,提高程序的性能。
综上所述,GCD是iOS开发中强大的多线程编程工具,通过合理使用队列和任务调度策略,可以简化多线程编程的复杂度,提高程序的性能和响应性。
iOS应用中的数据持久化有哪些方式?
iOS应用中的数据持久化是移动应用开发中的重要部分,它允许应用在重启或设备关机后仍能保留用户数据。iOS中常用的数据持久化方式主要包括以下几种:
1. 属性列表(Property List, plist)
属性列表是一种轻量级的数据持久化方式,适用于保存简单的数据结构,如字符串、数字、日期、字典和数组等。它以plist文件的形式存储,可以通过NSDictionary和NSArray类进行读写操作。属性列表持久化简单易用,适合存储小规模的数据。
2. 归档(Archiving)
归档是一种将对象及其属性转换为二进制数据流的技术,适用于保存自定义的对象或复杂的数据结构。在iOS中,可以使用NSKeyedArchiver和NSKeyedUnarchiver类来实现对象的归档和解档操作。通过归档,可以将自定义的对象及其属性保存到文件中,并在需要时重新还原成对象。归档持久化适合存储复杂的数据结构和自定义对象。
3. SQLite数据库
SQLite是一种轻量级的关系型数据库,广泛应用于iOS开发中。它支持结构化的数据存储,并提供了一组API进行数据库的创建、查询、插入、更新和删除等操作。在iOS中,可以直接使用SQLite的API,也可以通过FMDB等第三方库来方便地使用SQLite数据库。SQLite数据库持久化适合需要高效处理大量数据的应用程序。
4. Core Data
Core Data是苹果提供的一种面向对象的数据持久化框架,它提供了一个抽象层,将数据存储和业务逻辑分离。Core Data可以方便地管理应用程序的数据模型、数据关系和数据操作。它可以使用SQLite作为底层存储,也可以使用其他持久化方式。通过Core Data,开发人员可以更加高效地进行数据的存储和查询。
5. 偏好设置(User Defaults)
偏好设置是一种简单的数据持久化方法,适合存储少量的用户偏好设置和配置信息。它使用NSUserDefaults类来存储和读取数据,数据保存在应用的沙盒目录下的一个属性列表文件中。偏好设置持久化适合保存一些用户界面选项、用户登录状态等简单的数据。
6. 文件管理(File Management)
文件管理是一种直接操作文件系统来进行数据持久化的方法。通过文件管理,开发人员可以直接使用文件系统的API来创建、读取、写入和删除文件。在iOS中,可以使用NSFileManager类来进行文件的管理操作。通过文件管理,可以将数据以文件的形式保存在应用的沙盒目录中,实现数据的持久化存储。
7. 键值存储(Key-Value Storage)
键值存储是一种基于键值对的简单数据存储方式,适合存储少量的键值对数据。在iOS中,除了使用NSUserDefaults外,还可以使用自定义的键值存储库(如MMKV、leveldb等)来进行键值存储。键值存储持久化适合保存一些简单的配置信息、缓存数据等。
8. iCloud存储
iCloud是苹果提供的云存储服务,可以将数据存储在云端,实现跨设备的数据同步和备份。在iOS开发中,可以使用iCloudKit框架来实现与iCloud的数据交互。通过iCloud存储持久化,用户可以在不同的设备上访问和管理他们的数据。
9. 网络存储
网络存储是一种将数据存储在远程服务器上的持久化方法。在iOS中,可以使用网络通信技术(如HTTP、FTP等)与服务器进行数据交互,将数据发送到服务器并保存。通过网络存储,可以实现跨设备的数据同步和共享,但需要考虑网络连接的稳定性和安全性。
总结
iOS应用中的数据持久化方式多种多样,每种方式都有其适用场景和优缺点。开发人员应根据应用的需求和特点,综合考虑数据规模、复杂性、性能要求以及跨设备同步等因素,选择最合适的数据持久化方法。同时,也可以采用多种数据持久化方法的组合,以实现优异的数据存储和管理效果。
相关文章:
IOS热门面试题一
GCD(Grand Central Dispatch)是什么?如何在iOS中使用它? GCD(Grand Central Dispatch)是什么? GCD(Grand Central Dispatch)是苹果公司开发的一套多线程编程的API&…...
构建LangChain应用程序的示例代码:62、如何使用Oracle AI向量搜索和Langchain构建端到端的RAG(检索增强生成)pipeline
Oracle AI 向量搜索与文档处理 Oracle AI向量搜索专为人工智能(AI)工作负载设计,允许您基于语义而非关键词来查询数据。 Oracle AI向量搜索的最大优势之一是可以在单一系统中结合对非结构化数据的语义搜索和对业务数据的关系搜索。 这不仅功能强大,而且…...
ffmpeg转换MP4为gif命令
这里记录一下使用 ffmpeg去转化 gif 的一些快捷命令 # 直接转换 ffmpeg -i 222.mp4 -r 12 222.gif# 调色板优化处理 ffmpeg -i 222.mp4 -r 12 -vf "split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" 222.gif第二条命令的解释如下: split[s0][s1]&am…...
kotlin Flow 学习指南 (三)最终篇
目录 前言Flow生命周期StateFlow 替代LiveDataSharedFlow其他常见应用场景处理复杂、耗时逻辑存在依赖关系的接口请求组合多个接口的数据 Flow使用注意事项总结 前言 前面两篇文章,介绍了Flow是什么,如何使用,以及相关的操作符进阶ÿ…...
Memcached负载均衡:揭秘高效缓存分发策略
标题:Memcached负载均衡:揭秘高效缓存分发策略 在分布式缓存系统中,Memcached通过负载均衡技术来提高缓存效率和系统吞吐量。负载均衡确保了缓存请求能够均匀地分配到多个缓存节点上,从而防止任何一个节点过载。本文将深入探讨Me…...
【Python实战因果推断】31_双重差分2
目录 Canonical Difference-in-Differences Diff-in-Diff with Outcome Growth Canonical Difference-in-Differences 差分法的基本思想是,通过使用受治疗单位的基线,但应用对照单位的结果(增长)演变,来估算缺失的潜…...
ArcGIS中使用线快速构造成面的方法
准备工作:一个需要转化为面的封闭线;一个处于可编辑状态的面要素文件。 1.选中一个围合封闭成的线 2.点击高级编辑工具中的构造面小工具 3.弹出对话框,直接点确定即可 4.效果如下图: 特别注意:记得要把面图层编辑功能…...
Spring AOP的几种实现方式
1.通过注解实现 1.1导入依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.1.6.RELEASE</version></dependency> 1.2定义注解 import java.lang.annotation.*;Targ…...
字节码编程bytebuddy之实现抽象类并并添加自定义注解
写在前面 本文看下使用bytebuddy如何实现抽象类,并在子类中添加自定义注解。 1:代码 1.1:准备基础代码 类和方法注解 package com.dahuyou.bytebuddy.cc.mine;import java.lang.annotation.ElementType; import java.lang.annotation.Re…...
LLM-阿里云 DashVector + ModelScope 多模态向量化实时文本搜图实战总结
文章目录 前言步骤图片数据Embedding入库文本检索 完整代码 前言 本文使用阿里云的向量检索服务(DashVector),结合 ONE-PEACE多模态模型,构建实时的“文本搜图片”的多模态检索能力。整体流程如下: 多模态数据Embedd…...
CentOS7安装部署git和gitlab
安装Git 在Linux系统中是需要编译源码的,首先下载所需要的依赖: yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker方法一 下载: wget https://mirrors.edge.kernel.org/pub/s…...
《昇思25天学习打卡营第16天|基于MindNLP+MusicGen生成自己的个性化音乐》
MindNLP 原理 MindNLP 是一个自然语言处理(NLP)框架,用于处理和分析文本数据。 文本预处理:包括去除噪声、分词、词性标注、命名实体识别等步骤,使文本数据格式化并准备好进行进一步分析。 特征提取:将文…...
算法学习day10(贪心算法)
贪心算法:由局部最优->全局最优 贪心算法一般分为如下四步: 将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 一、摆动序列(理解难) 连续数字之间的差有正负的交替&…...
卡尔曼滤波Kalman Filter零基础入门到实践(上部)
参考视频:入门(秒懂滤波概要)_哔哩哔哩_bilibili 一、入门 1.引入 假设超声波距离传感器每1ms给单片机发数据。 理论数据为黑点, 测量数据曲线为红线,引入滤波后的数据为紫线 引入滤波的作用是过滤数据中的噪声&a…...
力扣-dfs
何为深度优先搜索算法? 深度优先搜索算法,即DFS。就是找一个点,往下搜索,搜索到尽头再折回,走下一个路口。 695.岛屿的最大面积 695. 岛屿的最大面积 题目 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相…...
keepalived高可用集群
一、keepalived: 1.keepalive是lvs集群中的高可用架构,只是针对调度器的高可用,基于vrrp来实现调度器的主和备,也就是高可用的HA架构;设置一台主调度器和一台备调度器,在主调度器正常工作的时候࿰…...
文献翻译与阅读《Integration Approaches for Heterogeneous Big Data: A Survey》
CYBERNETICS AND INFORMATION TECHNOLOGIES’24 论文原文下载地址:原文下载 目录 1 引言 2 大数据概述 3 大数据的异构性 4 讨论整合方法 4.1 大数据仓库(BDW) 4.2 大数据联盟(BDF) 5 DW 和 DF 方法的比较、分…...
应用最优化方法及MATLAB实现——第3章代码实现
一、概述 在阅读最优方法及MATLAB实现后,想着将书中提供的代码自己手敲一遍,来提高自己对书中内容理解程度,巩固一下。 这部分内容主要针对第3章的内容,将其所有代码实现均手敲一遍,中间部分代码自己根据其公式有些许的…...
django的增删改查,排序,分组等常用的ORM操作
Django 的 ORM(对象关系映射)提供了一种方便的方式来与数据库进行交互。 1. Django模型 在 myapp/models.py 中定义一个示例模型:python from django.db import modelsclass Person(models.Model):name models.CharField(max_length100)age…...
Leetcode Java学习记录——树、二叉树、二叉搜索树
文章目录 树的定义树的遍历中序遍历代码 二叉搜索树 常见二维数据结构:树/图 树和图的区别就在于有没有环。 树的定义 public class TreeNode{public int val;public TreeNode left,right;public TreeNode(int val){this.val val;this.left null;this.right nu…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
