Begin iOS7 GCD

//
//  ViewController.m
//  Begin iOS7 GCD
//
//  Created by zyz on 15-4-1.
//  Copyright (c) 2015年 Apple. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

//storyboard三个控件
@property (weak, nonatomic) IBOutlet UIButton *startButton;
@property (weak, nonatomic) IBOutlet UILabel *resultTextView;
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *spinner;
@end

@implementation ViewController

- (NSString *)fetchSomethingFromServer{
    [NSThread sleepForTimeInterval:1];
    return @"Hi, Here";
}

- (NSString *)processData:(NSString *)data{
    [NSThread sleepForTimeInterval:2];
    return [data uppercaseString];
}

- (NSString *)calculateFirstResult:(NSString *)data{
    [NSThread sleepForTimeInterval:3];
    return [NSString stringWithFormat:@"Number of chars: %lu", (unsigned long)[data length]];
}

- (NSString *)calculateSecondResult:(NSString *)data{
    [NSThread sleepForTimeInterval:4];
    return [data stringByReplacingOccurrencesOfString:@"E" withString:@"e"];
}

//点击事件
- (IBAction)buttonClick:(id)sender {
    self.startButton.enabled = NO;
    [self.spinner setHidden:NO];
    [self.spinner startAnimating];
    dispatch_queue_t queue1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue1, ^{
        NSLog(@"queue1 Thread is %@",[NSThread currentThread]);
        NSDate *startTime = [NSDate date];
        NSString *fetchedDate = [self fetchSomethingFromServer];
        NSString *processDate = [self processData:fetchedDate];

        NSString *firstResult = [self calculateFirstResult:processDate];
        NSString *secondResult = [self calculateSecondResult:processDate];

        dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_queue_t queue3 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

        //注意字符串只定义,不会为字符串分配空间,追加字符串会失败,这里定义为空的正确方式
        __block NSString *resultsSummary = [NSString stringWithFormat:@""];

        //异步加载,可能还没有执行完成就执行主线程的异步加载
        dispatch_async(queue2, ^{
            resultsSummary = [NSString stringWithFormat:@"First:[%@]\n",firstResult];
            NSLog(@"queue2 Thread is %@",[NSThread currentThread]);
        });

        dispatch_async(queue3, ^{
            resultsSummary = [resultsSummary stringByAppendingString:[NSString stringWithFormat:@"Second:[%@]",secondResult]];
            NSLog(@"queue3 Thread is %@",[NSThread currentThread]);
        });

        dispatch_async(dispatch_get_main_queue(), ^{
            //这里字符串仍然为空,因为异步加载执行的语句还没有完成就到了这里
            resultsSummary = [resultsSummary stringByAppendingString:@"1111"];
            //label的内容是1111,或者是其他的可能结果
            self.resultTextView.text = resultsSummary;
            self.resultTextView.backgroundColor = [UIColor brownColor];
            [self.spinner stopAnimating];
            [self.spinner setHidden:YES];
        });
        NSDate *endTime = [NSDate date];
        NSLog(@"Completed in %f seconds",[endTime timeIntervalSinceDate:startTime]);
    });
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self.spinner setHidden:YES];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
时间: 2024-10-12 20:29:26

Begin iOS7 GCD的相关文章

iOS开发之多线程技术——GCD篇

本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & Asynchronous 同步 & 异步 二.Serial Queues & Concurrent Queues 串行 & 并发 三.Global Queues全局队列 四.Main Queue主队列 五.同步的作用 六.dispatch_time延迟操作 七.线程安全(单例dispa

2014比例简化

题目描述 Description 在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果.例如,对某一观点表示支持的有1498人,反对的有902人,那么赞同与反对的比例可以简单的记为1498:902. 不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会满意.因为这个比例的数值太大,难以一眼看出它们的关系.对于上面这个例子,如果把比例记为5:3,虽然与真实结果有一定的误差,但依然能够较为准确地反映调查结果,同时也显得比较直观. 现给出支持人数A,反对人数B,以及一个上限L,请你将

【数论Day4】 数学 题解

题目:http://www.cnblogs.com/ljc20020730/p/7041033.html 1.离散函数(function.pas/c/cpp) 观察右图,图像必须符合任意两点都在直线的下方.故三条直线中只有相邻两顶点之间的连线的斜率最大.故得出一个规律:最大斜率的直线一定由x坐标相邻的两点确定,即Xi-Xi-1最大的点对. O(n)枚举,通过本题. var n,i,ans1,ans2,maxk:longint; a:array[1..200000]of longint; begi

BZOJ 1050: [HAOI2006]旅行comf(枚举+并查集)

[HAOI2006]旅行comf Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大边和最小边的比值最小.如果S和T之间没有路径,输出”IMPOSSIBLE”,否则输出这个比值,如果需要,表示成一个既约分数. 备注: 两个顶点之间可能有多条路径. Input 第一行包含两个正整数,N和M.下来的M行每行包含三个正整数:x,y和v.表示景点x到景点y之间有一条

Baby Step Gaint Step

给定同余式,求它在内的所有解,其中总是素数. 分析:解本同余式的步骤如下 (1)求模的一个原根 (2)利用Baby Step Giant Step求出一个,使得,因为为素数,所以有唯一解. (3)设,这样就有,其中,那么得到. (4)求出所有的,可以知道一共有个解,我们求出所有的,然后排个序即可. O(sqrt(n))的时间复杂度 BSGS如下(前向星版本) const maxn=200001; type node=record data,next,id:longint; end; type L

欧拉定理及扩展

目录 欧拉定理(EX及证明) 欧拉函数 定义 性质 如何求欧拉函数 欧拉定理 定义 证明 代码 扩展欧拉定理 定义 证明 \(\bf code\) 欧拉定理(EX及证明) 本篇很多推论基于质数唯一分解定理,请读者先行了解. 欧拉函数 定义 有两种: 定义欧拉函数 \(\varphi(x)\) 表示小于 \(x\) 且与 \(x\) 互质的数的个数,定义 \(1\) 与任何数互质. 定义剩余类 \(c_i\) 是 \(mod\;x=i\) 的数的集和,即所有 \(a\%x=i\) 的 \(a\).

GCD(st表)

GCD Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 3432    Accepted Submission(s): 1227 Problem Description Give you a sequence of N(N≤100,000) integers : a1,...,an(0<ai≤1000,000,000). There a

gcd的性质+分块 Bzoj 4028

4028: [HEOI2015]公约数数列 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 865  Solved: 311[Submit][Status][Discuss] Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. MODIFY id x: 将 a_{id} 修改为 x. 2. QUERY x: 求最小的整数 p (0 <= p < n),使

Gym 100299C &amp;&amp; UVaLive 6582 Magical GCD (暴力+数论)

题意:给出一个长度在 100 000 以内的正整数序列,大小不超过 10^ 12.求一个连续子序列,使得在所有的连续子序列中, 它们的GCD值乘以它们的长度最大. 析:暴力枚举右端点,然后在枚举左端点时,我们对gcd相同的只保留一个,那就是左端点最小的那个,只有这样才能保证是最大,然后删掉没用的. UVaLive上的数据有问题,比赛时怎么也交不过,后来去别的oj交就过了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000&qu