Swift并发编程实战:5个关键技巧让你彻底告别线程阻塞问题

第一章:Swift并发编程的核心概念

Swift 5.5 引入了全新的并发模型,基于结构化并发(Structured Concurrency)设计,旨在简化异步代码的编写与维护。这一模型通过 async/await 语法、Actor 模型和任务(Task)层级体系,提供了更安全、可读性更强的并发编程方式。

异步函数与 await 调用

在 Swift 中,异步函数使用 async 关键字声明,调用时需在异步上下文中使用 await。这使得异步操作的调用看起来如同同步代码,提升了可读性。
// 定义一个异步函数
func fetchData() async -> String {
    try? await Task.sleep(nanoseconds: 1_000_000_000)
    return "Data loaded"
}

// 在异步上下文中调用
let result = await fetchData()
print(result)
上述代码定义了一个模拟网络请求的异步函数,并通过 await 等待其完成。注意,await 只能在 async 函数或任务中使用。

任务(Task)与并发执行

Swift 使用 Task 来启动独立的并发操作。每个任务都是结构化并发的一部分,具有明确的生命周期和父子关系。
  1. 创建一个新任务使用 Task { } 语法
  2. 任务可被显式取消(cancel)以释放资源
  3. 任务间可通过 await 同步等待结果

Actor 模型与数据隔离

为避免数据竞争,Swift 提供了 actor 类型,它通过消息传递机制保护内部状态。
特性说明
隔离性actor 内部状态只能由其自身方法访问
线程安全Swift 自动确保同一时间只有一个任务能访问 actor
actor DataStore {
    private var data: [String] = []
    
    func add(_ item: String) {
        data.append(item)
    }
    
    func getAll() -> [String] {
        return data
    }
}
该 DataStore actor 安全地管理共享数据,外部访问需通过异步调用。

第二章:掌握async/await与任务上下文

2.1 理解异步函数的执行机制与编译器优化

异步函数的核心在于非阻塞执行,通过事件循环调度任务。JavaScript 引擎在遇到 async 函数时,会将其返回值包装为 Promise,内部的 await 表达式则会被编译器转换为状态机。
编译器如何转换异步函数
现代编译器将 async/await 语法糖编译为基于 Promise 的链式调用。例如:

async function fetchData() {
  const res = await fetch('/api/data');
  return await res.json();
}
上述代码被编译为:

function fetchData() {
  return Promise.resolve().then(() => {
    return fetch('/api/data');
  }).then((res) => {
    return res.json();
  });
}
await 被转化为 then 回调,实现暂停与恢复。
优化策略对比
优化技术作用
尾调用优化减少栈帧开销
Promise 内联缓存加速 resolve 路径

2.2 使用Task启动并发操作并管理生命周期

在.NET中,Task是执行异步操作的核心类型,能够以轻量级方式启动并发任务并精确控制其生命周期。
创建与启动任务
使用Task.Run可快速将CPU密集型操作放入线程池执行:
Task task = Task.Run(() =>
{
    for (int i = 0; i < 100; i++)
    {
        Console.WriteLine($"Processing {i}");
        Thread.Sleep(10);
    }
});
该代码启动一个后台任务执行循环操作。Task.Run自动调度到线程池,避免阻塞主线程。
生命周期管理
通过await或Wait()同步等待任务完成,推荐使用await避免死锁:
await task;
此外,可结合CancellationToken实现取消机制,实现对长期运行任务的安全中断。

2.3 避免死锁:正确使用await与同步代码交互

在异步编程中,混合使用 await 与同步阻塞操作容易引发死锁,尤其是在单线程上下文(如UI线程或ASP.NET经典管道)中调用 .Result 或 .Wait()。
常见死锁场景
public async Task<string> GetDataAsync()
{
    var result = await httpClient.GetStringAsync("https://api.example.com/data");
    return result;
}

// 错误示例:在同步方法中强制等待
public string GetSyncData()
{
    return GetDataAsync().Result; // 可能导致死锁
}
上述代码在调用 Result 时会阻塞当前线程,等待异步任务完成,而该任务需回到原上下文继续执行,形成循环等待。
解决方案
  • 始终使用 async/await 向上传播异步调用
  • 避免在同步方法中调用异步方法的 Result 或 Wait()
  • 必要时使用 .ConfigureAwait(false) 脱离原始同步上下文
正确写法:
public async Task<string> GetSafeDataAsync()
{
    return await GetDataAsync().ConfigureAwait(false);
}
ConfigureAwait(false) 指示后续延续不在原始上下文中执行,打破死锁链。

2.4 任务取消与异常处理的最佳实践

在并发编程中,合理处理任务取消与异常是保障系统稳定性的关键。使用上下文(Context)可优雅地传递取消信号。
使用 Context 实现任务取消

ctx, cancel := context.WithCancel(context.Background())
go func() {
    time.Sleep(2 * time.Second)
    cancel() // 触发取消
}()

select {
case <-ctx.Done():
    fmt.Println("任务被取消:", ctx.Err())
}
该代码通过 context.WithCancel 创建可取消的上下文,子协程在特定条件下调用 cancel() 发出取消信号,主流程通过监听 <-ctx.Done() 捕获并处理。
异常安全的资源清理
  • 始终在 defer 中调用 cancel,防止资源泄漏
  • 检查 ctx.Err() 判断取消原因
  • 结合超时机制使用 context.WithTimeout 更安全

2.5 实战演练:构建无阻塞的网络请求链

在高并发场景下,阻塞式网络请求会显著降低系统吞吐量。采用异步非阻塞方式串联多个HTTP请求,是提升响应效率的关键。
使用Go语言实现并发请求链
func fetch(url string, ch chan<- string) {
    resp, _ := http.Get(url)
    defer resp.Body.Close()
    ch <- fmt.Sprintf("Fetched %s", url)
}

ch := make(chan string, 2)
go fetch("https://api.a.com/data", ch)
go fetch("https://api.b.com/status", ch)
fmt.Println(<-ch, <-ch)
该代码通过goroutine并发执行两个网络请求,并利用带缓冲channel收集结果,避免主协程阻塞。
性能对比
模式平均延迟(ms)吞吐量(QPS)
同步串行800125
异步并行300330

第三章:Actor模型与线程安全设计

3.1 Swift Actor如何隔离可变状态

Swift 中的 Actor 是一种引用类型,专为在并发环境中安全地管理可变状态而设计。它通过串行执行机制确保同一时间只有一个任务能访问其内部状态,从而避免数据竞争。
Actor 的基本结构
actor TemperatureMonitor {
    private var temperature: Double = 0.0

    func update(temperature: Double) {
        self.temperature = temperature
    }

    func getTemperature() async -> Double {
        return await temperature
    }
}
上述代码定义了一个 TemperatureMonitor actor,其私有变量 temperature 只能通过 actor 自身的方法访问。由于 actor 隐式将所有方法调用调度到同一个串行队列,因此对 temperature 的读写是线程安全的。
隔离机制原理
当外部代码调用 actor 方法时,Swift 运行时会将该调用封装为一个异步任务,并提交至 actor 的专属执行队列。即使多个任务同时请求,也按顺序逐一执行,实现状态访问的互斥。
  • Actor 隔离(Actor Isolation)是编译器强制的访问控制机制
  • 跨 actor 访问必须使用 await,以显式表明潜在的异步等待
  • 非隔离上下文中无法直接访问 actor 内部可变状态

3.2 使用actor保护共享资源避免数据竞争

在并发编程中,多个线程同时访问共享资源容易引发数据竞争。Actor模型通过封装状态和串行化消息处理,有效避免此类问题。
Actor的核心机制
每个Actor拥有独立的状态,对外暴露消息接口。所有状态变更必须通过消息驱动,确保同一时刻只有一个操作作用于内部数据。
代码示例:Go中的Actor模式模拟
type Counter struct {
    value  int
    update chan int
}

func (c *Counter) Start() {
    go func() {
        for delta := range c.update {
            c.value += delta // 唯一修改点,串行执行
        }
    }()
}
上述代码中,update通道作为消息入口,所有增量操作按序处理,天然避免并发写入。
优势对比
机制并发安全实现方式
互斥锁显式加锁/解锁,易出错
Actor通过消息队列隐式串行化

3.3 非孤立属性的风险与解决方案

在分布式系统中,非孤立属性可能导致并发操作下的数据不一致问题。当多个事务同时读写共享属性时,缺乏隔离机制会引发脏读、不可重复读和幻读。
典型并发问题示例
  • 脏读:事务读取了未提交的数据
  • 不可重复读:同一事务内多次读取结果不一致
  • 幻读:因其他事务插入或删除导致记录数变化
基于乐观锁的解决方案
type Account struct {
    ID      uint64
    Balance int
    Version int // 版本号控制
}

func UpdateBalance(account *Account, delta int, db *sql.DB) error {
    for {
        var currentVersion int
        err := db.QueryRow("SELECT balance, version FROM accounts WHERE id = ? FOR UPDATE", account.ID).
            Scan(&account.Balance, ¤tVersion)
        if err != nil || currentVersion != account.Version {
            return fmt.Errorf("data conflict, retry needed")
        }
        newBalance := account.Balance + delta
        result, err := db.Exec("UPDATE accounts SET balance = ?, version = version + 1 WHERE id = ? AND version = ?", 
                               newBalance, account.ID, account.Version)
        if err == nil && result.RowsAffected() > 0 {
            break
        }
    }
    return nil
}
上述代码通过版本号实现乐观锁,每次更新校验版本一致性,防止并发写入覆盖。若更新失败则需重试,确保操作原子性。
隔离级别对比
隔离级别脏读不可重复读幻读
读未提交可能可能可能
读已提交否可能可能
可重复读否否可能
串行化否否否

第四章:结构化并发与高级控制流

4.1 使用TaskGroup实现动态并发任务管理

在异步编程中,动态管理多个并发任务是常见需求。Python 3.11 引入的 TaskGroup 提供了结构化并发支持,能够在异常发生时自动取消其他任务并确保资源清理。
基本用法
async with asyncio.TaskGroup() as tg:
    task1 = tg.create_task(fetch_data("url1"))
    task2 = tg.create_task(fetch_data("url2"))
上述代码中,create_task 将任务加入组内,async with 确保所有任务完成或异常时正确退出。
优势对比
特性TaskGroup传统gather
异常处理立即取消其他任务继续运行
任务取消自动传播需手动管理

4.2 并发地图(concurrentMap)的高效实现

在高并发场景下,传统哈希表因锁竞争成为性能瓶颈。并发地图(concurrentMap)通过分段锁(Segment)或无锁结构提升读写效率。
分段锁机制
将数据划分为多个段,每段独立加锁,减少线程阻塞:

type ConcurrentMap struct {
    segments [16]*segment
}

func (m *ConcurrentMap) Get(key string) interface{} {
    seg := m.segments[hash(key)%16]
    seg.RLock()
    defer seg.RUnlock()
    return seg.data[key]
}
该实现中,hash(key)%16 决定所属段,读操作使用读锁,提升并发读性能。
性能对比
实现方式读性能写性能内存开销
全局互斥锁低低小
分段锁高中中
无锁CAS极高高大

4.3 优先级继承与任务调度优化

在实时操作系统中,高优先级任务因低优先级任务持有共享资源而被阻塞,可能引发**优先级反转**问题。优先级继承机制通过临时提升持有锁任务的优先级,缓解此类调度异常。
优先级继承工作流程
当高优先级任务等待被低优先级任务持有的互斥锁时,系统将低优先级任务的优先级临时提升至请求者的级别,确保其能尽快释放资源。
当前状态调度行为
Task_Low 持有锁正常运行
Task_High 请求锁提升 Task_Low 优先级
Task_Low 释放锁恢复原优先级,Task_High 抢占执行
代码实现示例

// 伪代码:启用优先级继承的互斥锁
pthread_mutexattr_t attr;
pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT);
pthread_mutex_init(&mutex, &attr);
上述配置使互斥锁在争用时触发优先级继承,PTHREAD_PRIO_INHERIT 表示启用该协议,避免高优先级任务无限等待。

4.4 实战:构建高性能图片批量处理器

在处理大规模图像任务时,性能瓶颈常出现在I/O与CPU密集型操作的协调上。通过并发控制与资源池化,可显著提升处理吞吐量。
核心架构设计
采用生产者-消费者模式,结合Goroutine池控制并发数,避免系统资源耗尽。

func processImage(task ImageTask, workerID int) error {
    img, err := loadImage(task.SrcPath)
    if err != nil {
        return err
    }
    resized := resizeImage(img, task.Width, task.Height)
    return saveImage(resized, task.DstPath)
}
该函数封装单图处理流程,参数包括源路径、目标尺寸和输出路径,确保职责单一。
并发控制策略
使用有缓冲通道限制活跃Goroutine数量,防止内存溢出:
  • 任务队列:通过 chan ImageTask 分发任务
  • Worker池:固定N个Goroutine从队列消费
  • 等待组:同步所有worker完成状态
参数推荐值说明
Worker数量4×CPU核心数平衡I/O与计算开销
任务队列缓冲1024平滑突发负载

第五章:彻底告别线程阻塞的架构思维

异步非阻塞 I/O 的核心实践
现代高并发系统设计中,线程阻塞是性能瓶颈的主要根源。采用异步非阻塞 I/O 模型,可显著提升系统吞吐能力。以 Go 语言为例,其原生支持的 goroutine 能以极低开销实现百万级并发连接处理。
// 基于 channel 的非阻塞任务调度
func asyncTask(ch chan string) {
    time.Sleep(100 * time.Millisecond)
    ch <- "task completed"
}

func main() {
    ch := make(chan string)
    go asyncTask(ch)
    // 主线程不阻塞,继续执行其他逻辑
    fmt.Println("doing other work...")
    result := <-ch // 需要结果时再同步等待
    fmt.Println(result)
}
事件驱动架构的应用场景
在 Web 服务器开发中,Node.js 和 Netty 等框架通过事件循环机制避免线程等待。每个请求注册回调函数,I/O 完成后由事件分发器触发执行,极大减少线程上下文切换开销。
  • 使用 epoll(Linux)或 kqueue(BSD)实现高效 I/O 多路复用
  • 将数据库查询封装为 Promise 或 Future,避免同步等待响应
  • 结合消息队列(如 Kafka)解耦服务间调用,实现最终一致性
协程与线程池的对比优势
特性线程池协程
创建开销高(MB 级栈)低(KB 级栈)
上下文切换成本内核级切换用户级调度
最大并发数数千级百万级
[客户端] → [事件循环] → {I/O 多路复用} ↓ [回调队列] → 执行非阻塞逻辑
Swift5多线程系列一GCD基础篇 Swift5多线程系列一 提示:iOS多线程以GCD居多,swift也如是 swift的GCD,使用比OC上更加简单易上手; 文章目录Swift5多线程系列一前言一、第一部分:基础篇 前言 Grand Central Dispatch简称GCD,苹果官方推荐给开发者使用的首选多线程解决方案。多线程开发涉及的细节非常多 阅读详情

相关推荐

Swift语言的多线程编程

多线程是一种技术,允许一个程序同时运行多个线程。线程是程序中执行的基本单位,每个线程都有自己的调用栈和程序计数器,但它们共享进程中的资源。利用多线程可以使得应用程序在执行时间较长的操作时,例如网络请求或文件读写时,保持响应性。

2501_90120817的博客 604

【编程语言】从入门到精通:Swift 5.6.3实战指南

本文介绍了Swift 5.6.3的基础知识和应用实践。主要内容包括:Swift 5.6.3的特点和优势,如简洁语法、类型安全和高性能;开发环境搭建步骤;基础语法如变量、数据类型和控制流;面向对象编程中的类与结构体、继承多态等概念;并通过一个待办事项清单应用演示了项目开发流程。文章还分析了Swift 5.6.3的新特性,包括并发编程改进和语法优化,并展望了Swift在苹果生态和服务器端的发展前景。

大雨淅淅的博客 1349

30、结构化并发编程:Swift 5.5 带来的变革

本文详细介绍了Swift 5.5引入的结构化并发特性,及其对并发编程带来的变革。文章从并发编程的基本概念讲起,分析了传统多线程和异步编程中存在的问题,如执行顺序不确定、共享数据问题、返回值和错误处理困难等。随后,重点讲解了Swift 5.5中通过async、await、async let等新特性如何简化异步代码逻辑、提升代码可读性与安全性。最后,通过实际应用场景如网络请求和数据库操作,展示了结构化并发在开发中的优势与使用方式。本文适合iOS开发者了解并掌握Swift 5.5中现代化的并发编程技术。

corn8的博客 76

【Swift iOS应用实战】:掌握这7个关键点,让你的App稳定性提升90%

提升iOS应用稳定性?掌握Swift iOS应用实战中的7个关键点,涵盖内存管理、异常处理与性能优化等核心方法,适用于中大型项目开发。有效减少崩溃率,提升用户体验,值得收藏。

InitPulse的博客 591

Swift项目开发实战:MousouLINE源码分析

本文还有配套的精品资源,点击获取 简介:MousouLINE项目基于Swift语言开发,可能是一个应用或工具的代码库,涉及即时通讯和社交网络功能。文章将深入探讨Swift语言的关键特性,并对项目中的UI设计、网络编程、JSON处理、多线程、推送通知、数据库集成、动画效果、第三方库使用、测试和版本控制等关键知识点进行分析,预测可能的技术实现。 1. Swift语言基...

weixin_32251525的博客 1335

swift3.0微博实战项目视频

swift3.0微博实战项目视频

Swift主题色顶级解决方案

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34405557的博客 390

Swift语言教程 :Swift 项目实战

Swift语言实战,包括布局、UI、动画、手势、绘图和数据以及其他的UI游戏项目等等(例如2048)

Swift并发编程的概念和实现

Swift并发编程通过、actors和任务系统,提供了一种安全、高效的方式来处理多任务。概念上,它强调结构化并发和数据隔离;实现上,代码简洁且易于维护。优先使用actors管理共享资源。利用编译器检查(如Swift的并发安全模型)避免常见错误。性能优化时,考虑并行度公式T∝1PT∝P1​,其中PPP是任务并行数。通过以上示例和解释,您可以快速上手Swift并发编程。如需深入,参考苹果官方文档或实践更多场景。

2501_93582548的博客 1725

RK3588 MPP视频编码实战:从环境搭建到高效封装

本文详细介绍了在RK3588平台上利用MPP(Media Process Platform)进行硬件视频编码的完整实战流程。从MPP库的环境搭建、编译安装,到核心编码参数(如码率控制、GOP、图像对齐)的深入解析,并提供了一个可复用的C++编码器类封装方案,帮助开发者快速实现高效的H.264/H.265视频编码,显著降低CPU占用。

weixin_29192211的博客 348

SAP 深入理解库存

当 某个期间发生货物移动的时候,系统在更新mard数据的之前(这个表是实时更新的),会检查此笔业务过账期间和mard里对应记录的期间是否一致,也就是 看这是不是本期间第一笔移动。其二,我们不能保证这定期的作业的确定性,硬件维护、系统性能都可能使这预定的“时刻”出现偏差,如果某一次没能抓取该时刻的库存,对整个报表来说,是数据的缺失;中,当某一期间(Period)的第一项操作更新了物料数量或价值,则SAP系统会向表MBEWH写入一条记录,以第一项操作之前的余额、价格控制为标准。这对于业务数据量大的。

matinal 當冬夜漸暖 。公众号:matinal 3621

Swift Promise库进阶技巧:用InvalidatableQueue彻底告别列表复用竞态bug

Swift Promise库([Package.swift](https://link.gitcode.com/i/5e273a4ddfb004d4708d8a43ef501474) 中的 `Promises` 包)是一个基于 JavaScript A+ 规范设计的 Promise 异步编程库,支持 `then`、`catch`、`all`、`race` 等经典用法。今天聚焦一个鲜少被提及却极其实

gitblog_00086的博客 1184

青藏高原冻土数据实战:如何用QGIS分析1961-2020年冻土退化趋势(附完整操作步骤)

本文详细介绍了如何使用QGIS分析1961-2020年青藏高原冻土退化趋势,包括数据准备、预处理、时空分析和模型验证等全流程操作。通过TTOP模型和Stefan方程,揭示了冻土退化的空间差异和海拔依赖性,为环境研究提供科学依据。

weixin_29276847的博客 127

Swift多线程开发避坑指南:10个你必须知道的线程同步与通信技巧

掌握Swift线程用法难题?本文详解GCD、OperationQueue等多线程技术在实际开发中的应用技巧,涵盖线程同步、通信机制与常见陷阱规避。提升应用性能与响应性,iOS开发者值得收藏的实战指南。

LogicShoal的博客 811

DLMS-Blue-Book蓝皮书—曲线类

attribute_index 1 指的是第 1 个属性(即 logical_name),attribute_index 2 指的是第 2 个属性,等等;如果其他“曲线通用类”对象捕获了这个缓冲区,它们的缓冲区也将被清空,以保证它们的缓冲区条目是同质的。如果捕获对象是曲线通用类的缓冲区,则 data_index 标识缓冲区(即列)中的捕获对象(即内部曲线通用类中的列);如果曲线通用类已排序,则调用捕获方法将把新条目存储在缓冲区中的适当位置,移动所有后续条目,并可能丢失最不相关的条目。

一个bug是bug,多个bug能work 1452

史上最小白之RNN详解

1.前言 网上目前已经有诸多优秀的RNN相关博客,但是我写博客的出发点主要是为了加深和巩固自己的理解,所以还是决定自己再进行一下总结和描述,如有不正确的地方欢迎指正~ 2.区分RNN 循环神经网络(Recurrent Neural Network),递归神经网络(Recursive Neural Network),你有没有发现他们的缩写都是RNN,那他们两个是同一回事儿吗?网上有一些博客把这两就当...

Tink1995的博客 4万+

Swift语言的线程

线程是操作系统能够进行运算的最小单元,是进程中的一个执行流。每个进程可以拥有多个线程,这些线程共享进程的资源(如内存、文件描述符等)。通过多线程技术,可以实现多个任务并发执行,提高程序的运行效率。自定义操作类需要继承自Operation,并重写main方法以定义具体执行的任务。```swift// 执行任务```在Swift语言中,线程管理是一个复杂但至关重要的主题。通过使用GCD、Operation Queue以及对POSIX线程的理解,开发者可以有效地管理并发任务,提升应用程序的性能和响应速度。

2501_91290916的博客 635

DeepSeek绝了!3分钟生成PPT,专治“五彩斑斓的黑“!!(保姆教程)

DeepSeek绝了!3分钟生成PPT,专治"五彩斑斓的黑"!!(保姆教程)

yizhen91y的博客 4万+

FutureKit并发编程:5种Executor策略与GCD队列优化技巧

FutureKit是Swift中一个强大的Future/Promises库,专门为iOS和macOS开发者设计,提供了一套完整的并发编程解决方案。如果你正在寻找一种更优雅、更安全的方式来处理异步操作和并发任务,那么FutureKit绝对值得深入了解!🚀 ## 为什么选择FutureKit进行并发编程? 在iOS和macOS开发中,处理异步操作和并发任务一直是开发者面临的挑战。传统的GCD和O

gitblog_00643的博客 836

用KalmanNet搞定非线性状态估计:当卡尔曼滤波遇上神经网络

本文深入探讨了KalmanNet如何将神经网络与卡尔曼滤波结合,以解决非线性状态估计中的模型失配和噪声不确定性问题。通过保留经典滤波框架并用RNN学习卡尔曼增益,该方法在无人机导航、机器人定位等场景中实现了模型驱动与数据驱动的优势互补,提升了估计的鲁棒性和灵活性。

mango的博客 310

C++实现设计ATM机系统

这个示例实现了一个基本的ATM机系统,支持注册、登录、存款、取款、查询余额和保存数据等功能。当然,这只是一个简单的ATM机模拟,实际的ATM机系统需要更复杂的逻辑和更严格的安全措施。C++编写一个简单的ATM机系统,我将提供一个基本的实现示例,但由于ATM机系统的复杂性和安全性要求,这只是一个简单的模拟,不适合在实际环境中使用。试设计一简单模拟ATM机系统,系统以菜单方式工作,采用自定义函数设计各功能模块被主菜单调用,使之能提供以下基本选项。=========欢迎使用ATM=========

走向CTO的路上... 1243

Realm Swift SDK 与 Swift 并发:await 线程跳转、异步写入与 Actor 隔离实战指南

本文基于 Realm Swift SDK 官方并发指南,系统讲解如何在 Swift 5.6/5.7 及更高版本的并发模型下安全使用 Realm:包括 `await` 挂起点造成的线程跳转风险、`writeAsync`/`asyncWrite` 两种后台写入 API 的差异、Tasks/TaskGroups 与 Actor 隔离的使用边界,以及 `Realm accessed from incorr

gitblog_00071的博客 627

android 蓝牙通讯demo

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

iOS Swift 线程开发指南

iOS线程开发指南摘要 主线程负责UI渲染和用户交互,必须避免耗时操作以免触发看门狗机制导致应用终止。子线程处理网络请求、文件I/O等耗时任务。Swift推荐使用现代并发方案:Task通过async/await提供结构化并发,自动管理线程资源;GCD适合简单后台任务;OperationQueue适用于需要依赖管理的复杂工作流。Thread因管理成本高已不推荐使用。开发核心原则:主线程保持轻量高效,耗时任务交给子线程,通过DispatchQueue.main.async或@MainActor安全更新UI。Sw

qixingchao的专栏 1168

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

PromiseKit 实战指南:告别常见误用,掌握 Swift Promise 链式编程的核心技巧

PromiseKit 是 Swift 与 Objective-C 生态中成熟的 Promise 库,其价值不仅在于提供 `Promise`、`Guarantee` 等异步抽象,更在于它鼓励一种"可组合、可预测"的异步编程范式。本文基于仓库中的 [Documentation/Appendix.md](https://link.gitcode.com/i/73a0a580087a03c8d3c078f

gitblog_01069的博客 129

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Swift Concurrency:Async/Await并发编程终极指南

**Swift并发编程**是iOS开发中提升应用性能的关键技术,而**Async/Await**作为Swift 5.5引入的革命性特性,彻底改变了我们处理异步任务的方式。🚀 本文将为您提供一份完整的**Swift并发编程指南**,帮助您快速掌握这一现代并发编程模型。 ## 📱 Swift并发编程的重要性 在移动应用开发中,**异步编程**是不可或缺的一部分。无论是网络请求、文件操作还是UI

gitblog_00575的博客 1039
上一篇: Kotlin与Java混编实战案例(一线大厂架构设计机密流出)
下一篇: 从零开始搭建Swift SQLite持久化层,手把手教你构建稳定数据引擎
fastdebug
博客等级 码龄11年 149粉丝 2006原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值