[精通Objective-C]三种实现并发编程的方式

本文介绍了Objective-C中三种实现并发编程的方法:线程(隐式创建和显示创建)、操作和操作队列,以及分派队列GCD。通过示例代码展示了如何使用这些技术,并对比了它们的优缺点,强调了操作队列的面向对象特性和GCD的高性能。
摘要由CSDN通过智能技术生成

[精通Objective-C]三种实现并发编程的方式

参考书籍:《精通Objective-C》【美】 Keith Lee

目录

线程

隐式创建并启动线程

使用NSObject类中的performSelectorInBackground: withObject:方法可以隐式地创建和启动用于执行对象中方法的新线程。该线程会作为后台次要进程立刻启动,而当前进程会立刻返回。下面是一个使用该方法的实例:

首先创建一个继承于NSObject类的,含有将由独立线程执行的方法的类:

#import <Foundation/Foundation.h>

@interface ConcurrentProcessor : NSObject

@property(readwrite) BOOL isFinished;
@property(readonly) NSInteger computeResult;

-(void)computeTask:(id)data;

@end
#import "ConcurrentProcessor.h"

@interface ConcurrentProcessor()
@property(readwrite)NSInteger computeResult;
@end

@implementation ConcurrentProcessor
{
    NSString *computeID;     // @synchronized指令锁定的唯一对象
    NSUInteger computeTasks; // 并行计算任务的计数
    NSLock *computeLock;     // 锁对象
}

-(id)init{
    if ((self = [super init])) {
        _isFinished = NO;
        _computeResult = 0;
        computeLock = [NSLock new];
        computeID = @"1";
        computeTasks = 0;
    }
    return self;
}

-(void)computeTask:(id)data{
    NSAssert(([data isKindOfClass:[NSNumber class]]), @"Not an NSNumber instance");
    NSUInteger computations = [data unsignedIntegerValue];
    // 配置线程环境时应在线程入口点创建自动释放池与异常处理程序
    @autoreleasepool {
        @try {
            if ([[NSThread currentThread] isCancelled]) {
                return;
            }
            // @synchronized指令括号内为唯一标识符,标识符保护的代码块对象只能同时被最多一个线程访问
            @synchronized (computeID) {
                // 增加活动任务的计数
                computeTasks++;
            }

            // 获取锁并执行关键代码部分中的计算操作
            [computeLock lock];
            if ([[NSThread currentThread] isCancelled]) {
                [computeLock unlock];
                return;
            }
            NSLog(@"Performing computations %lu",computations);
            for (int ii = 0; ii < computations; ii++) {
                self.computeResult = self.computeResult + 1;
            }
            // 完成计算并解除锁
            [computeLock unlock];
            // 模拟额外的处理时间
            [NSThread sleepForTimeInterval:1.0];

            // 减少活动任务数,如果数量为0,则更新标志位
            @synchronized (computeID) {
                computeTasks--;
                if (!computeTasks) {
                    self.isFinished = YES;
                }
            }
        } @catch (NSException *exception) {}
    }
}
@end

最后在main.m中进行测试:

#import <Foundation/Foundation.h>
#import "ConcurrentProcessor.h"

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值