首页 > 其他分享 >IOS多线程之NSOperation(2)

IOS多线程之NSOperation(2)

时间:2023-04-05 17:55:55浏览次数:36  
标签:IOS number NSOperation 线程 func cancel operation 多线程 open

IOS多线程之NSOperation(2)

最大并发数

open var maxConcurrentOperationCount: Int

并发数就是同时执行的任务数。比如,同时开3个线程执行3个任务,并发数就是3。
但是,并发数是3,并不代表开启的线程数就是3,也有可能是4个或者5个。因为线程有可能在等待,进入了就绪状态。

执行的过程:

  1. 把操作添加到队列;
  2. 去线程池去取空闲的线程,如果没有就创建线程;
  3. 把操作交给线程池中取出的线程执行;
  4. 执行完成后,把线程再放回线程池中;
  5. 重复2,3,4直到所有的操作都执行完。

GCD的区别

GCD会自动重用线程,而 NSOperation 不会,会一直开线程。
而开太多线程反而会影响效率,我们需要自己控制
可以通过最大并发数控制

let queue = OperationQueue()
queue.maxConcurrentOperationCount = 3
for _ in 0..<10{
    queue.addOperation {
        sleep(1)
        print("\(Thread.current)")
    }
}
/*
<NSThread: 0x6000001e0e80>{number = 4, name = (null)}
<NSThread: 0x6000001e2d80>{number = 7, name = (null)}
<NSThread: 0x6000001fc340>{number = 5, name = (null)}
<NSThread: 0x6000001f8cc0>{number = 8, name = (null)}
<NSThread: 0x6000001e0e80>{number = 4, name = (null)}
*/

//打印时是3个3个打印的

队列的操作

//暂停
func suspend(){
    queue.isSuspended = true
}
//继续
func resume(){
    queue.isSuspended = false
}
//取消
func cancel(){
    queue.cancelAllOperations()
}

Operation的状态

//取消
open var isCancelled: Bool { get }
//执行中
open var isExecuting: Bool { get }
//完成
open var isFinished: Bool { get }
//就绪
open var isReady: Bool { get }

控制Operation的状态

//启动
open func start()
//取消
open func cancel()

可以继承自定义MyOperation继承Operation类,重写startcancel方法来自己管理

let operation = MyOperation()
operation.start()
operation.cancel()

class MyOperation: Operation {
    override func start() {
        super.start()
        print("operation started")
    }

    override func main() {
        super.main()
        print("operation main")
    }

    override func cancel() {
        super.cancel()
        print("operation cancel")
    }
}

/*
operation main
operation started
operation cancel
*/

标签:IOS,number,NSOperation,线程,func,cancel,operation,多线程,open
From: https://www.cnblogs.com/r1cardo/p/17290093.html

相关文章

  • IOS多线程之NSOperation(3)
    IOS多线程之NSOperation(3)操作优先级和服务质量可以通过QueuePriority属性来设置operation在队列中的执行优先级publicenumQueuePriority:Int,@uncheckedSendable{caseveryLow=-8caselow=-4casenormal=0casehigh=4caseveryHigh......
  • Java并发和多线程4:使用通用同步工具CountDownLatch实现线程等待
    CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 用给定的计数初始化CountDownLatch。由于调用了countDown()方法,所以在当前计数到达零之前,await方法会一直受阻塞。之后,会释放所有等待的线程,awai......
  • IOS网络状态变化监听
    IOS网络状态变化监听使用Alamofire库的NetworkReachabilityManager一共有三种状态///Itisunknownwhetherthenetworkisreachable.caseunknown///Thenetworkisnotreachable.casenotReachable///Thenetworkisreachableontheassociated`ConnectionType`......
  • IOS富文本
    IOS富文本通过String创建一个NSMutableAttributedString,必须是带有Mutable的可变富文本,否则无法添加属性letstring="我是一个富文本"letastring=NSMutableAttributedString(string:string)给NSMutableAttributedString添加属性astring.addAttributes([.foregroun......
  • 有关IOS内存读写冲突
    有关IOS内存读写冲突在写内存相关代码时,获取已使用内存代码中报错lethostPort:mach_port_t=mach_host_self()varhost_size=mach_msg_type_number_t(MemoryLayout<vm_statistics_data_t>.stride/MemoryLayout<integer_t>.stride)varpagesize:vm_siz......
  • IOS多线程之NSOperation(1)
    IOS多线程之NSOperation(1)NSOperation是OC语言中基于GCD的面向对象的封装;提供了一些用GCD不好实现的功能;线程的生命周期由系统自动管理。NSOperation需要和NSOperationQueue配合使用来实现多线程方案。单独使用NSOperation的话,它是属于同步操作,并不具备开......
  • iOS - 利用 UIBezierPath 绘制圆弧
    iOS-利用UIBezierPath绘制圆弧APIUIBezierPath绘制圆弧主要利用以下方法:openfuncaddArc(withCentercenter:CGPoint,radius:CGFloat,startAngle:CGFloat,endAngle:CGFloat,clockwise:Bool)方法中各参数含义:center:圆心radius:半径startAngle:开始弧度endAn......
  • IOS实现水波纹
    IOS实现水波纹需要实现一个水波纹效果其实就是画两个正弦函数或者余弦函数的layer在view上面,根据屏幕刷新率来重绘,更新其左右偏移量来让其看起来是在左右移动具体实现定义两个layer,用不同的颜色填充lazyvarfrontLayer:CAShapeLayer={lettempV=CAShap......
  • IOS颜色选择器
    IOS颜色选择器UIColorWellUIColorWell是一个继承UIControl的视图,它不能调整大小和UISwitch类似,大小大约是44*44。点击可弹出一个选择颜色的弹窗因为是继承UIControl所以可以添加UIControlEventValueChanged类型的Event事件去监听颜色改变///Setstheselectedcoloron......
  • 黑马程序员高端iOS培训:苹果一条公告搅混了大家的脑洞
         正文前面,先说点正经的。苹果公司在北京时间8月30日凌晨正式向媒体发出邀请函,宣布将于北京时间9月8日凌晨1点在旧金山的比尔-格雷厄姆市政礼堂举行苹果秋季新品发布会。此次邀请函的主题为“Seeyouonthe7th”。     正经的说完了,不正经的要开始说了。或许是天......