iOS——GCD,多线程编程

什么是GCD

GCD是一异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统升级中实现。开发者只需要定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并执行计划。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。
GCD用我们难以置信的非常简洁的记述方法,实现了极为复杂繁琐的多线程编程,可以说这是一项划时代的技术

使用GCD源代码例子

dispatch_async (queue, ^{
/*长时间处理
例如AR用画像识别
例如数据库访问
长时间处理结束,主线程使用该处理结果 
*/
dispatch_async (dispatch_get_main_queue(),^{
/*只有主线程可以执行的处理
例如用户界面更新 
*/

上面就是在后台线程中执行长时间处理,处理结束时,主线程使用该处理结果的源代码。
dispatch_async (queue,^{
这仅有一行的代码表示让处理在后台线程中执行
dispatch_async (dispatch_get-main_queue(), ^{
这样,仅此一行代码就能让处理在主线程中执行。

多线程编程

iOS中的多线程编程是指在iOS应用程序中使用多个线程来同时执行多个任务。通常,iOS应用程序都是单线程的,这意味着应用程序中的所有任务都是按顺序执行的,并且一次只能执行一个任务。使用多线程编程可以让应用程序同时执行多个任务,从而提高应用程序的效率和性能

多线程的基本概念

  • 进程:可以理解成一个运行中的应用程序,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,主要管理资源。
  • 线程:是进程的基本执行单元,一个进程对应多个线程。
  • 主线程:处理UI,所有更新UI的操作都必须在主线程上执行。不要把耗时操作放在主线程,会卡界面。
  • 多线程:在同一时刻,一个CPU只能处理1条线程,但CPU可以在多条线程之间快速的切换,只要切换的足够快,就造成了多线程一同执行的假象。

线程就像火车的一节车厢,进程则是火车。车厢(线程)离开火车(进程)是无法跑动的,而火车(进程)至少有一节车厢(主线程)。多线程可以看做多个车厢,它的出现是为了提高效率。
多线程是通过提高资源使用率来提高系统总体的效率。
我们运用多线程的目的是:将耗时的操作放在后台执行

在iOS中使用多线程编程需要使用NSThread或GCD(Grand Central Dispatch)。NSThread是苹果公司提供的一个用于创建和管理线程的库,它允许开发人员创建一个新线程并在该线程中执行任务。GCD是一个苹果公司提供的用于优化应用程序的多核编程的技术。它使用多核处理器技术来自动分配任务并在多个线程上并行执行任务。

使用多线程编程可以提高应用程序的性能和用户体验,因为它可以使应用程序在执行某些任务时保持响应。例如,如果应用程序正在执行一个计算密集型任务,它可能会卡住并导致界面“卡死”,无法响应用户的操作。使用多线程编程,可以将这个计算密集型任务放到一个新的线程中执行,从而避免卡住主线程,使应用程序仍然能够响应用户的操作。

多线程编程也可以用于实现多任务处理。例如,一个应用程序可以同时执行下载数据、解析数据和更新界面等任务。
分别放到不同的线程中执行,从而有效地利用多核处理器的优势。

当然,使用多线程编程也会带来一些挑战。例如,如果多个线程同时访问同一个内存空间,可能会导致数据不一致或冲突。因此,在使用多线程编程时,开发人员需要注意数据同步和冲突问题。

总之,多线程编程是一种有用的技术,可以提高应用程序的性能和用户体验。但是,它也带来了一些挑战,需要开发人员谨慎使用和管理。

int main () {
id o = [[myObject alloc] init];
[o execBlock];
return 0;

虽然调用了几个方法,但是代码基本上是从上到下的顺序执行的。

如何使用多线程编程

在iOS中使用多线程编程,可以使用NSThread或GCD来实现。下面是一个使用NSThread的示例代码:

- (void)doSomeWork {
    // 新建一个线程
    NSThread *thread = [[NSThread alloc] initWithTarget:self
                                               selector:@selector(threadMainMethod:)
                                                 object:nil];
    // 启动线程
    [thread start];
}

- (void)threadMainMethod:(id)object {
    // 在新线程中执行任务
    // ……
}

下面是使用GCD的示例代码:

- (void)doSomeWork {
    // 获取主队列
    dispatch_queue_t mainQueue = dispatch_get_main_queue();

    // 异步执行任务
    dispatch_async(mainQueue, ^{
        // 在主线程中执行任务
        // ……
    });
}

上面的代码中,NSThread用于新建一个线程并启动它,并在新线程中执行指定的任务。GCD则用于将任务放到一个队列中执行,并可以指定任务的执行方式,例如是否异步执行。

GCD的使用

需要注意的是,在使用多线程编程时,需要考虑数据同步和冲突问题,以避免线程安全问题。此外,多线程编程也可能增加系统的复杂度,需要开发人员谨慎使用和管理。
要使用GCD,您需要先导入<dispatch/dispatch.h>库,然后您就可以使用GCD的一些基本功能来创建和管理线程。比如,可以使用dispatch_async函数来创建一个新的线程,并在这个新线程上执行一个任务。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Perform some task in the background
});

您也可以使用dispatch_sync函数在当前线程中执行任务,或者使用dispatch_async函数在主线程中执行任务。

dispatch_sync(dispatch_get_main_queue(), ^{
    // Update UI
});

GCD还提供了一些其他很有用的功能,比如控制线程组合和线程之间的同步,以及定时执行任务等。

关于NSThread

如果您需要在多线程应用程序中实现多线程编程,NSThread是一个不错的选择。它可以让您轻松地创建新线程并执行任务,并且提供了一些基本的功能来控制线程的属性。

然而,NSThread的简单性也是它的一个缺点。它缺少一些重要的功能,比如容易管理的线程池和线程组,以及同步和定时执行任务的能力。如果您需要这些功能,您可能需要考虑使用更强大的工具,比如GCD或者NSOperation。

另外,NSThread在多核处理器环境下不太容易使用。在这种情况下,您可能需要使用GCD或者NSOperation来更好地利用多核处理器的优势。

NSThread的使用

NSThread是一个轻量级的类,用于在iOS和macOS应用程序中实现多线程编程。它可以让您创建新线程并执行任务,并允许您控制线程的各种属性,比如线程名称和优先级。

要使用NSThread,您需要先导入<Foundation/Foundation.h>库,然后您就可以使用NSThread类来创建和管理线程。

要创建一个新线程,可以使用NSThread的detachNewThreadSelector:toTarget:withObject:方法。这个方法需要您指定要在新线程上执行的方法以及该方法的目标对象,并传递任何需要传递给该方法的对象。

- (void)performTaskOnNewThread {
    [NSThread detachNewThreadSelector:@selector(performTask) toTarget:self withObject:nil];
}

- (void)performTask {
    // Perform some task
}

您也可以使用NSThread的initWithTarget:selector:object:方法来创建一个新的NSThread对象,然后再调用该对象的start方法来启动线程。这种方法允许您在创建线程之前设置线程的属性,比如线程名称和优先级。

- (void)performTaskOnNewThread {
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(performTask) object:nil];
    thread.name = @"My Thread";
    thread.threadPriority = 0.5;
    [thread start];
}

- (void)performTask {
    // Perform some task
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值