zoukankan      html  css  js  c++  java
  • Swift

    1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术:
    (1)NSThread
    (2)Cocoa NSOperation(NSOperation和NSOperationQueue)
    (3)Grand Central Dispath(GCD)


    2,本文着重介绍Cocoa NSOperation
    Cocoa NSOperation不需要关心线程管理和数据同步的事情,可以把精力放在自己需要执行的操作上。相关的类有NSOperation和 NSOperationQueue。其中NSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的子 类:NSBlockOperation。创建NSOperation子类的对象,把对象添加到NSOperationQueue队列里执行。

    3,使用NSOperation的两种方式
    (1)直接用定义好的子类:NSBlockOperation。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    import UIKit
     
    class ViewController: UIViewController {
     
        override func viewDidLoad() {
            super.viewDidLoad()
             
            var operation:NSBlockOperation = NSBlockOperation(block: { [weak self] in
                self?.downloadImage()
                return
            })
             
            //创建一个NSOperationQueue实例并添加operation
            var queue:NSOperationQueue = NSOperationQueue()
            queue.addOperation(operation)
        }
         
        //定义一个下载图片的方法,线程调用
        func downloadImage(){
            var imageUrl = "http://hangge.com/blog/images/logo.png"
            var data = NSData(contentsOfURL: NSURL(string: imageUrl)!, options: nil, error: nil)
            println(data?.length)
        }
         
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }


    (2)继承NSOperation 

    然后把NSOperation子类的对象放入NSOperationQueue队列中,一旦这个对象被加入到队列,队列就开始处理这个对象,直到这个对象的所有操作完成,然后它被队列释放。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    import UIKit
     
    class ViewController: UIViewController {
     
        override func viewDidLoad() {
            super.viewDidLoad()
             
            //创建线程对象
            var downloadImageOperation:DownloadImageOperation = DownloadImageOperation()
             
            //创建一个NSOperationQueue实例并添加operation
            var queue:NSOperationQueue = NSOperationQueue()
            queue.addOperation(downloadImageOperation)
        }  
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    }
     
    class DownloadImageOperation: NSOperation {
        override func main(){
            var imageUrl = "http://hangge.com/blog/images/logo.png"
            var data = NSData(contentsOfURL: NSURL(string: imageUrl)!, options: nil, error: nil)
            println(data?.length)
        }
    }


    4,设置运行队列并发数 

    NSOperationQueue队列里可以加入很多个NSOperation,可以把NSOperationQueue看做一个线程池,可往线程池中添加操作(NSOperation)到队列中。
    可以设置线程池中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样可以同时运行队列中的全部操作。
    1
    2
    //设置并发数
    queue.maxConcurrentOperationCount = 5


    5,取消队列所有操作

    1
    2
    //取消所有线程操作
    queue.cancelAllOperations()


    6,每个NSOperation完成都会有一个回调表示任务结束

    1
    2
    3
    4
    5
    6
    7
    //定义一个回调
    var completionBlock:(() -> Void)?
    //给operation设置回调
    operation.completionBlock = completionBlock
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 4), dispatch_get_main_queue(), {
        println("Complete")
    })
  • 相关阅读:
    Property 'dataSource' threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy
    java.lang.NoClassDefFoundError: org/apache/commons/pool/KeyedObjectPoolFactory
    java.lang.NoClassDefFoundError: org/springframework/dao/support/DaoSupport
    Java 读取项目路径下文件
    #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column..........this is incompatible with sql_mode=only_full_group_by
    VSCode官网下载缓慢或下载失败的解决办法
    This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de 错误解决办法
    org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3
    学习方法
    springmvc中文乱码
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4841134.html
Copyright © 2011-2022 走看看