GCD之全局、主线程


-(NSString *)fetchData

{

    [NSThread sleepForTimeInterval:1];

    return @"Hello world";

}

-(NSString *)firstCast:(NSString *)data

{

    [NSThread sleepForTimeInterval:2];

    return [data uppercaseString];

}

-(NSString *)secondCast:(NSString *)data

{

    [NSThread sleepForTimeInterval:3];

    return [data stringByReplacingOccurrencesOfString:@"0" withString:@"o"];

}

-(NSInteger)thrid:(NSString *)data

{

    [NSThread sleepForTimeInterval:4];

    return [data length];

}

 1.在View中放置一个UIButton按钮和一个UITextView,在按钮点击事件中调用上面的方法

 2.按钮执行方法顺序如下:



- (IBAction)btnclick:(id)sender {

    //__block  声明变量可在block中修改 否则只有只读权限

    __block int a=10;

    NSDate *startTiem=[NSDate date];

    //对于全局队列(并行队列) 声明时第一个参数有三种:四种对应的是不同的全局队列 第二个参数目前未使用 始终为0

    //1.DISPATCH_QUEUE_PRIORITY_DEFAULT

    //2.DISPATCH_QUEUE_PRIORITY_HIGH

    //3.DISPATCH_QUEUE_PRIORITY_LOW    <br>    //4.DISPATCH_QUEUE_PRIORITY_BACKGROUND 

    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);

    //dispatch_async 开启异步线程

    dispatch_async(queue, ^{

       NSString *fetchstring= [self fetchData];

       NSString *firststring=[self firstCast:fetchstring];

       NSString *secondstring=[self secondCast:firststring];

       NSInteger length =[self thrid:fetchstring];

       NSDate *endtime=[NSDate date];

       //对于UI的更新获取值都在主线程中 此时要用主线程来更新 主 线程是串行队列

        dispatch_async(dispatch_get_main_queue(), ^{

            self.textview.text=secondstring;

        });

        a=9;//若未在声明变量时使用__block 时将会报错不能编译

       NSLog(@"%@",[NSString stringWithFormat:@"%ld  %@",length,secondstring]);

       NSLog(@"%f",[endtime timeIntervalSinceDate:startTiem]);

    });

}

3.输出结果

 

时间: 2024-07-28 14:01:59

GCD之全局、主线程的相关文章

ios-下载和设置UIImage不在主线程中

问题描述 下载和设置UIImage不在主线程中 从web服务器中添加一个图片.怎么设置它不在主线程上?我想要视图先加载,然后图片加载.这样用户在体验时不会感到很慢. 就是不知道怎么加到代码中. NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:mainImageUrl]]; UIImage *image = [ [UIImage alloc] initWithData:imageData]; UIView

c++中如何将子线程的参数传回主线程

问题描述 c++中如何将子线程的参数传回主线程 1C DWORD WINAPI threadFunction(LPVOID pArg) //返回值进程id(dword类型) 参数类型 LPVOID{ tNum myNum = *((tNum *)pArg); //将参数转化成int型 EnterCriticalSection(&gCS); // 进入临界区 myNum.string_back = FuzzyHash(myNum.string_in); LeaveCriticalSection(&a

VC 控制台程序串口通讯,串口收到数据如何发送消息给主线程?

问题描述 VC 控制台程序串口通讯,串口收到数据如何发送消息给主线程? 用CSerialPort类实现串口通讯,该类在收到数据后会调用::sendmessage函数,该函数的第一个参数是窗口句柄,但是控制台没有窗口句柄,该怎么发送消息?main函数里怎么响应消息? 解决方案 sendmessage wm_copydata 解决方案二: 控制台程序可以调用http://blog.csdn.net/coredoor/article/details/8582001

安卓,子线程获取网络图片,发消息给主线程,主线程用图片填充listview,出错

问题描述 安卓,子线程获取网络图片,发消息给主线程,主线程用图片填充listview,出错 先上logcat: 我的xml布局就是一个按钮,和一个listview,listview里就一个imageview,按下按钮开始从网络获取图片,然后发消息到主线程,然后listview就填充数据.xml代码就不贴了. 以下是mainactivity public class MainActivity extends AppCompatActivity implements View.OnClickList

异步任务如何阻塞主线程

问题描述 异步任务如何阻塞主线程 我在欢迎页面调用的百度定位的API,它是异步的任务,有时如果网络不够快,下面的代码继续执行时就会挂APP,因为欢迎页跳转后,后面的Activity有用到返回的数据,请问下大神有应该怎么阻塞它呢?我想让它返回结果后在继续执行我下面的代码 解决方案 不要阻塞主线程,不然异步就没意义了,还不如同步.你可以用事件通知主线程,主线程之后的代码放在事件中. 解决方案二: 就是主线程的跳转界面的代码放在事件回调中 解决方案三: 你可以把activity中需要返回数据部分的UI

android-是不是任意一个安卓程序都有一个主线程

问题描述 是不是任意一个安卓程序都有一个主线程 是不是任意一个安卓程序都有一个主线程 looper对象有什么用 如果有,这个默认的主线程是什么 解决方案 是的 mainThread 好像是 looper对象 可以百度一下 也可以参看官方文档 解决方案二: 主线程也就是UI线程,安卓程序面向用户,少不了UI界面,也少不了UI线程.Looper是一种循环机制,它维护了一个消息队列,配合Handler可以完成子线程和UI线程的通信. 解决方案三: 软件运行后,就会启动looper死循环,这里面从消息队

Android如何在自定义view中发送消息给主线程

问题描述 Android如何在自定义view中发送消息给主线程 求求各位大神支招,小弟在自己开发一个东西,遇到了一个小问题. ![ 图片说明](http://img.ask.csdn.net/upload/201603/15/1458054689_616589.jpg) 我在自定义view的onDraw里,当条件达到后就开启一个子线程发送消息给主线程,让主线程中的handler接收消息并执行相应的动作,可是在Log的输出下只能输出"子线程,"而没有"handlemessage

linux 把主线程cancel 掉后,由主线程创建的子线程会不会被cancel掉?

问题描述 linux 把主线程cancel 掉后,由主线程创建的子线程会不会被cancel掉? linux 把主线程cancel 掉后,由主线程创建的子线程会不会被cancel掉? 解决方案 不会.进程是独立的,不是线程.

怎么把主线程getText()得到的String放进子线程

问题描述 怎么把主线程getText()得到的String放进子线程 解决方案 不一定非要定义全局变量,我修改的如下,你运行看看,不行再定义全局变量.修改了3个地方 public class StartLoginActivity extends Activity { // 账号输入框 private EditText inputAccount; //密码输入框 private EditText inputPassword; // 登录按钮 private Button loginButton;