j9九游会登陆--首页直达

GCD实战实习:利用串行行列步队完成复杂的预加载
  • 智网科技
  • ###
  • 分类: 履历之谈
  • 阅读量: 102

正如利用别的多线程api一样,利用GCD也可以用于预加载。

本篇利用一个十分复杂的例子来形貌怎样做到预加载一个ViewController,其次要思绪是利用gcd在子线程中创立并初始化一个ViewController,在其加载终了后,将其push入navigation controller中

扼要代码如下:

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
30
31
32
33
34
35
36
37
38
39
40
41
@implementation DWClassA
{
    dispatch_queue_t _serialQueue;
    UINavigationController *_navController;
}
 
- (dispatch_queue_t)serialQueue
{
    if (!_serialQueue) {
        _serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);//创立串行行列步队
    }
    return _serialQueue;
}
 
- (void)prepareViewController
{
    dispatch_async([self serialQueue], ^{//把block中的义务放入串行行列步队中实行,这是第一个义务
        self.viewController = [[[DWViewController alloc] init] autorelease];
        sleep(2);//伪装这个viewController创立起来很花工夫。。实在view都还没加载,基本不花工夫。
        NSLog(@"prepared");
    });
}
 
- (void)goToViewController
{
    dispatch_async([self serialQueue], ^{//第二个义务,推入viewController
        NSLog(@"go");
        dispatch_async(dispatch_get_main_queue(), ^{//触及UI更新的操纵,放入主线程中
            [_navController pushViewController:self.viewController animated:YES];
        });
    });
}
 
- (void)dealloc
{
    _serialQueue && dispatch_release(_serialQueue);
    [_navController release];
    [_viewController release];
    [super dealloc];
}
@end

起首j9九游会创立了一个串行行列步队(利用DISPATCH_QUEUE_SERIAL作为参数),j9九游会晓得,将多个义务dispatch至一个串行行列步队,可以到达线程同步的结果,而且可以制止编写Lock相干的代码。j9九游会利用一个办法来封装这个串行行列步队的创立,使得后续操纵都能获得这个串行行列步队

紧接着j9九游会在prepare函数中,将创立并初始化ViewController的义务dispatch至串行行列步队中,一旦dispatch,义务将立刻开端实行,这里我利用sleep函数来模仿一个必要较永劫间来初始化的viewcontroller,而且sleep了夸大的两秒钟。

然后j9九游会在goTo函数中,将push义务dispatch至前述的串行行列步队中,现在始化完成后,会主动接着实行push义务,固然,假如dispatch这个push义务时,假如前述的初始化义务早已完成,那么push义务将被立刻实行。值得留意的是,在Cocoa开辟中,j9九游会必需将触及UI更新的操纵(即便这个操纵不会被立刻表现在屏幕中)放在主线程中实行,这是Apple在文档中划定的。

实践上Apple划定UIKit的办法都必需放在主线程中挪用,现实证明,的确许多不触及UI操纵的UIKit办法都不克不及在子线程中挪用,乃至一些文件加载的函数。而其基本缘故原由是UIKit的这些办法都在外部挪用了一些大概发生竞态的资源(许多办法会挪用render context来举行两头转换等操纵),而一些UIKit办法被验证的确能放在子线程中挪用(固然不保举这么做,由于这么做不波动,你不克不及确定某一天Apple会修正这些办法的外部完成而招致其只能在主线程中实行)也印证了这一点。

最初j9九游会在dealloc函数中开释应该开释的资源,留意dispatch_release办法不行以传入一个NULL指针,这将招致瓦解。

在GCD的头文件中j9九游会会发明这句正文:The result of passing NULL in this parameter is undefined.也便是说,不像free函数那样(free函数由POSIX界说传入NULL则什么都不干),dispatch_release是不克不及承受空指针的。