iOS中的网络和多线程编程(五)

简介: iOS中的网络和多线程编程(五)

用户下载一个大图片,分成很多份下载,如何使用GCD实现


使用Dispatch Group追加block到Global GroupQueue,这些block如果全部执行完毕,那么就会执行通过dispatch_group_notify添加到主队列中的block,进行图片的合并处理。


dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue, ^{
    /*加载图片1*/
});
dispatch_group_async(group, queue, ^{
        /*加载图片2*/
    });
dispatch_group_async(group, queue, ^{
      /*加载图片3*/
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    // 合并图片......
});


项目中什么时候选择使用GCD?什么时候选择NSOperation


NSOperation是对线程的高度抽象,提供Objective-C语言接口,具备面向对象特性(复用、封装),可子类化NSOperation进行操作对象的复用,使程序逻辑结构更清晰。比起GCD,NSOperation可以直接设置操作之间的依赖关系实现线程同步,而且可以通过调用cancel方法中途取消操作,而在GCD中不可取消。NSOperation的线程逻辑控制更加精细灵活,同时复杂度较GCD要高,因此建议在有特殊需求的复杂项目中使用。


GCD的最大优点是非常简单、易用,经过了官方的优化更加安全高效(多数函数是线程安全的)。对于不复杂的多线程操作,会节省代码量,尤其block参数的使用,使代码更为易读,建议在简单项目中广泛使用。


2466108-ba2c70cd3d1c8ccc.webp.jpg


NSOperation和GCD的特点


NSOpertion如何实现线程依赖


对于a、b、c 3个线程,如何使用NSOpertion和NSOpertionQueue实现执行完a和b后再执行c的结果?


对于上述问题,其实可以通过NSOpertion的依赖特性实现,即让c依赖于a和b,这样只有a和b都执行完后,c才可以开始执行。


/*获取主队列(主线程)*/
NSOperationQueue *queue = [NSOperationQueue mainQueue];
/*创建a、b、c操作*/
NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"Operation A Start!");
    [NSThread sleepForTimeInterval:3.0];
    NSLog(@"Operation A Done!");
}];
NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"Operation B Start!");
    [NSThread sleepForTimeInterval:3.0];
    NSLog(@"Operation B Done!");
}];
NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"Operation C Start!");
    //... ...
}];
/*添加操作依赖,c依赖于a和b*/
[c addDependency:a];
[c addDependency:b];
/*添加操作a、b、c到操作队列queue(特意将c在a和b之前添加)*/
[queue addOperation:c];
[queue addOperation:a];
[queue addOperation:b];


程序的输出结果为:


2466108-6939e35ef69eb8ab.webp.jpg



目录
相关文章
|
14天前
|
监控 安全
公司上网监控:Mercury 在网络监控高级逻辑编程中的应用
在数字化办公环境中,公司对员工上网行为的监控至关重要。Mercury 作为一种强大的编程工具,展示了在公司上网监控领域的独特优势。本文介绍了使用 Mercury 实现网络连接监听、数据解析和日志记录的功能,帮助公司确保信息安全和工作效率。
85 51
|
3月前
|
安全 网络安全 Android开发
安卓与iOS开发:选择的艺术网络安全与信息安全:漏洞、加密与意识的交织
【8月更文挑战第20天】在数字时代,安卓和iOS两大平台如同两座巍峨的山峰,分别占据着移动互联网的半壁江山。它们各自拥有独特的魅力和优势,吸引着无数开发者投身其中。本文将探讨这两个平台的特点、优势以及它们在移动应用开发中的地位,帮助读者更好地理解这两个平台的差异,并为那些正在面临选择的开发者提供一些启示。
127 56
|
1月前
|
安全 调度 数据安全/隐私保护
iOS线程锁
iOS线程锁
27 0
|
1月前
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
|
2月前
|
API Android开发 iOS开发
安卓与iOS开发中的线程管理对比
【9月更文挑战第12天】在移动应用的世界中,安卓和iOS平台各自拥有庞大的用户群体。开发者们在这两个平台上构建应用时,线程管理是他们必须面对的关键挑战之一。本文将深入探讨两大平台在线程管理方面的异同,通过直观的代码示例,揭示它们各自的设计理念和实现方式,帮助读者更好地理解如何在安卓与iOS开发中高效地处理多线程任务。
|
2月前
|
Swift iOS开发 UED
揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【9月更文挑战第5天】本文通过具体案例介绍如何在iOS应用中使用Swift与UIKit实现自定义按钮动画,当用户点击按钮时,按钮将从圆形变为椭圆形并从蓝色渐变到绿色,释放后恢复原状。文中详细展示了代码实现过程及动画平滑过渡的技巧,帮助读者提升应用的视觉体验与特色。
62 11
|
3月前
|
安全 Java 应用服务中间件
网络安全的护城河:漏洞防御与加密技术深入浅出Java并发编程
【8月更文挑战第31天】在数字世界的棋盘上,每一次点击都可能是一步棋。网络安全的战场无声却激烈,漏洞如同裂缝中的风,悄无声息地侵袭着数据的堡垒。本文将揭示网络漏洞的隐蔽角落,探讨如何通过加密技术筑起防线,同时提升个人和组织的安全意识,共同守护我们的数字家园。
|
3月前
|
API Windows
揭秘网络通信的魔法:Win32多线程技术如何让服务器化身超级英雄,同时与成千上万客户端对话!
【8月更文挑战第16天】在网络编程中,客户/服务器模型让客户端向服务器发送请求并接收响应。Win32 API支持在Windows上构建此类应用。首先要初始化网络环境并通过`socket`函数创建套接字。服务器需绑定地址和端口,使用`bind`和`listen`函数准备接收连接。对每个客户端调用`accept`函数并在新线程中处理。客户端则通过`connect`建立连接,双方可通过`send`和`recv`交换数据。多线程提升服务器处理能力,确保高效响应。
56 6
|
3月前
|
Swift iOS开发 UED
【绝妙创意】颠覆你的视觉体验!揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【8月更文挑战第13天】本文通过一个具体案例,介绍如何使用Swift与UIKit在iOS应用中创建独特的按钮动画效果。当按钮被按下时,其形状从圆形变化为椭圆形,颜色则从蓝色渐变为绿色;释放后,动画反向恢复原状。利用UIView动画方法及弹簧动画效果,实现了平滑自然的过渡。通过调整参数,开发者可以进一步优化动画体验,增强应用的互动性和视觉吸引力。
52 7
|
3月前
|
安全 测试技术 调度
iOS开发-多线程编程
【8月更文挑战第12天】在iOS开发中,属性的内存管理至关重要,直接影响应用性能与稳定性。主要策略包括:`strong`(强引用),保持对象不被释放;`weak`(弱引用),不保持对象,有助于避免循环引用;`assign`(赋值),适用于基本数据类型及非指针对象类型;`copy`(复制),复制对象而非引用,确保不变性。内存管理基于引用计数,利用自动引用计数(ARC)自动管理对象生命周期。此外,需注意避免循环引用,特别是在block中。最佳实践包括理解各策略、避免不必要的强引用、及时释放不再使用的对象、注意block中的内存管理,并使用工具进行内存分析。正确管理内存能显著提升应用质量。
下一篇
无影云桌面