iOS8 多线程Multithreading简介

来源:互联网 发布:西安新榜样软件 编辑:程序博客网 时间:2024/06/07 06:39

多线程(Multithreading)

队列(queues)

在iOS中多线程主要是关于“队列”。队列中使用“块”。块被队列提取出来,在相关的线程上执行。

主队列(main queue)

所有的UI活动都必须且只能在在主队列上执行。

相对地,那些消耗内存的非UI活动必须在其他队列上执行。

总之,原则是让UI响应起来。

其他的队列

多数情况下,iOS帮我们建立好了其他的队列。

1.两种方式建立主队列

  dispatch_queue_t mainQ = dispatch_get_main_queue();

  NSOperationQueue *mainQ = [NSOperationQueue mainQueue];

2.建立其他队列

dispatch_queue_t otherQ = dispatch_queue_create(“name”, NULL);//name是字符型常量

3.在主队列上调用方法

- (void)performSelectorOnMainThread:(SEL)aMethod

                           withObject:(id)obj

waitUntilDone:(BOOL)waitUntilDone; dispatch_async(dispatch_get_main_queue(), ^{ /*调用的方法 */ });

4.多线程示例

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL urlWithString:@“http://...”]];

  NSURLConfiguration *configuration = …;

//下面在主队列上建立session,这样就可以在task中处理UI

    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration

                                                    delegate:nil

                                                   delegateQueue:[NSOperationQueue mainQueue]];

  NSURLSessionDownloadTask *task;

  task = [session downloadTaskWithRequest:request

                        completionHandler:^(NSURL *localfile, NSURLResponse *response, NSError *error) {

/* 可以在此处处理UI/ }];

//如果要在此处处理一些非UI进程,最好很快, 千万不要阻碍主队列!

[task resume];


当然,如果session不在主队列,而你想做一些UI的事情,那么可以在主队列上使用“块”。

NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration]; //不在主队列上 

NSURLSessionDownloadTask *task;

  task = [session downloadTaskWithRequest:request

                        completionHandler:^(NSURL *localfile, NSURLResponse *response, NSError *error) {

      dispatch_async(dispatch_get_main_queue(), ^{ /* do UI things */ });

      or [self performSelectorOnMainThread:@selector(doUIthings) withObject:nil waitUntilDone:NO];

  }];

  [task resume];



0 0
原创粉丝点击