首先我们需要知道的是,什么是多线程? 线程可以理解为我们的处理器在处理我们需要执行的程序或者说代码的一个队列。而多线程就是指我们可以把我们需要处理的事情分开多个队列,让处理器分开去处理,让这些程序或者说代码看上去是在一起执行的,这就是多线程。
OK,那么我们为什么需要多线程呢? 这是因为在我们的主程序里面,而就是我们的主线程里面,我们不希望花费很多的时间来等待程序的响应,比如说我们需要下载网上的一张图片,我们不希望在下载的过程中,我们只能傻傻地等着程序把图片下载完成,而是可以去干其他的事情,把下载的任务交给例外一个队列,当图片下载完了,主程序再把图片放上去。
上面一段话其实涉及了几个重要的知识点:
1。我们程序运行存在一个特殊的队列,就是主队列。主队列其实就是我们程序运行的主干,也就是说我们应该避免把一些等待时间较长的任务放在主队列里面去,这样才能让我们的程序的用户体验更加好,这也是我们为什么要使用多线程。
2。也许你会想,那我把什么任务都放到其他的队列上去,那主队列不是很轻松,运行不是很高效了吗? 当然不是,因为但凡涉及到UI界面的操作,我们必须要在主线程里面实现。这是绝对的。
然而我们应该怎样创建和使用多线程呢?
GCD( Grand Central Dispatch )可以意为可调度队列,就是用于同步或者异步执行我们需要使用多线程的代码块。这比线程要更容易使用,而且效率更高。
使用步骤:
1。首先我们要获取我们的队列,无论是mainqueue(主队列),globalqueue(并发队列)或者是其他队列。
⬆️这是把我们需要执行的闭包 ^{ ... } 的代码放到另外一个线程里面去。
⬆️这是获取主队列
⬆️这是通过NSOperation(例外一种使用多线程的方法,以后我们会说到)获取队列
⬆️这是获取其他队列
这是获取global队列
2。实现代码
最后通过⬆️来将我们的代码加入到队列中,等待队列的执行,等到我们的代码被取出,执行。
例子:
在一个UITableView里面,我们直接使用了一个for循环来代表一个长时间的等待过程,现在我们为了不影响主线程的运行,我们把它放到一个并发的队列里面去,当等待完毕(循环结束),我们需要实现UI的操作,这是我们必须返回我们的主队列里去,这一点前面已经声明。
例子(结合NSURL):
⬆️使用了NSURLRequest和NSURLSession来下载一张网上的图片
问题:NSURL请求已经在例外一个队列里面执行,也就是
语句,当我们在里面写入我们需要执行的闭包代码,该代码就会放入一个队列中去,并且等待我们处理器将它取出来,执行。
那么如果我们的代码中含有UI界面的操作,应该怎么办?
1。使用委托
在session里面已经指定了代码会在主队列里面执行,所以我们不能在代码中加入开销特别大的任务。
2。直接指定主队列
在我们task的执行代码中,需要进行UI操作的代码,用主队列来完成