- 浏览: 222727 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
15197442045:
求demo,谢谢
IOS 后台执行代码(voip socket) -
15197442045:
我用了你这种方式,还是不能后台运行~~~~~
IOS 后台执行代码(voip socket) -
wlpych:
这个m_socket,从哪获得啊,什么方法?用的pjsip。求 ...
IOS 后台执行代码(voip socket)
1. GCD 使用后不用程序去管理线程的开闭,GCD会在系统层面上去动态检测系统状态,开闭线程
2. Dispatch Queues 单行 并行 2种 FIFO 把task依次放入单行queue可以实现顺序执行
3. Operation Queues 可以指定任务之间的优先级 task之间的先后依赖关系
4. __block变量是可以改变的 共享的
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
for (__block int i = 0; i<10000; i++) {
dispatch_async(aQueue, ^{
NSLog(@"%d",i);
});
}
2011-07-05 17:11:38.346 ttt[41418:1803] 61
2011-07-05 17:11:38.346 ttt[41418:5f03] 1292
2011-07-05 17:11:38.348 ttt[41418:1803] 4096
2011-07-05 17:11:38.348 ttt[41418:5f03] 4954
2011-07-05 17:11:38.349 ttt[41418:1803] 5823
2011-07-05 17:11:38.349 ttt[41418:5f03] 6159
2011-07-05 17:11:38.349 ttt[41418:1803] 6575
2011-07-05 17:11:38.349 ttt[41418:5f03] 6634
2011-07-05 17:11:38.350 ttt[41418:1803] 7936
2011-07-05 17:11:38.350 ttt[41418:5f03] 8428
2011-07-05 17:11:38.351 ttt[41418:1803] 8895
2011-07-05 17:11:38.351 ttt[41418:5f03] 9364
2011-07-05 17:11:38.351 ttt[41418:1803] 9836
2011-07-05 17:11:38.351 ttt[41418:5f03] 10000
2011-07-05 17:11:38.354 ttt[41418:1803] 10000
5. 一般外部变量是copy正在运行时的外部状态
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
for (int i = 0; i<1000; i++) {
dispatch_async(aQueue, ^{
NSLog(@"%d",i);
});
}
2011-07-05 17:15:37.525 ttt[41697:1803] 0
2011-07-05 17:15:37.526 ttt[41697:1803] 2
2011-07-05 17:15:37.527 ttt[41697:1803] 3
2011-07-05 17:15:37.527 ttt[41697:1803] 4
2011-07-05 17:15:37.527 ttt[41697:1803] 5
2011-07-05 17:15:37.527 ttt[41697:1803] 6
2011-07-05 17:15:37.526 ttt[41697:5f03] 1
2011-07-05 17:15:37.530 ttt[41697:5f03] 8
2011-07-05 17:15:37.530 ttt[41697:5f03] 9
2011-07-05 17:15:37.530 ttt[41697:5f03] 10
2011-07-05 17:15:37.530 ttt[41697:5f03] 11
2011-07-05 17:15:37.532 ttt[41697:6203] 13
6. queue可以有结束时执行的方法
void myFinalizerFunction(){
NSLog(@"xxx");
}
- (void)viewDidLoad {
[superviewDidLoad];
dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_set_context(queue, @"xxx");
dispatch_set_finalizer_f(queue, &myFinalizerFunction);
for (int i = 0; i<1000; i++) {
dispatch_async(queue, ^{
NSLog(@"%d",i);
});
}
dispatch_release(queue);
7. dispatch_sync(queue,task) 会阻塞当前线程 直到queue完成了你给的task, 但queue要完成你给的task,因为queue是FIFO的,意味着要完成之前的任务,才有机会执行你刚才给的task, 相当于当前线程等待queue里面所有任务执行完毕, 所以这句话不能在当前queue的任务代码里面调用,会造成死锁
dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_set_context(queue, @"xxx");
dispatch_set_finalizer_f(queue, &myFinalizerFunction);
for (int i = 0; i<10; i++) {
dispatch_async(queue, ^{
NSLog(@"%d",i);
});
}
NSLog(@"waiting");
dispatch_sync(queue, ^{
NSLog(@"wait done");
});
dispatch_release(queue);
2011-07-05 17:54:35.479 ttt[44203:207] waiting
2011-07-05 17:54:35.479 ttt[44203:1803] 0
2011-07-05 17:54:35.481 ttt[44203:1803] 1
2011-07-05 17:54:35.482 ttt[44203:1803] 2
2011-07-05 17:54:35.482 ttt[44203:1803] 3
2011-07-05 17:54:35.483 ttt[44203:1803] 4
2011-07-05 17:54:35.483 ttt[44203:1803] 5
2011-07-05 17:54:35.484 ttt[44203:1803] 6
2011-07-05 17:54:35.484 ttt[44203:1803] 7
2011-07-05 17:54:35.485 ttt[44203:1803] 8
2011-07-05 17:54:35.485 ttt[44203:1803] 9
2011-07-05 17:54:35.486 ttt[44203:207] wait done
2011-07-05 17:54:35.487 ttt[44203:1803] xxx
8. Waiting on Groups of Queued Tasks //dispatch_sync只能对一个queue等待
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
// Add a task to the group
dispatch_group_async(group, queue, ^{
NSLog(@"first task");
});
dispatch_queue_t otherqueue = dispatch_queue_create("com.example.MyQueue", NULL);
for (int i = 0; i<100; i++) {
dispatch_group_async(group, otherqueue, ^{
NSLog(@"otherqueue task");
});
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"end waiting");
dispatch_release(group);
2011-07-05 19:32:31.919 ttt[50138:5f03] otherqueue task
2011-07-05 19:32:31.919 ttt[50138:1803] first task
2011-07-05 19:32:31.922 ttt[50138:5f03] otherqueue task
2011-07-05 19:32:31.923 ttt[50138:5f03] otherqueue task
...
2011-07-05 19:32:32.078 ttt[50138:5f03] otherqueue task
2011-07-05 19:32:32.079 ttt[50138:5f03] otherqueue task
2011-07-05 19:32:32.080 ttt[50138:207] end waiting
9. Although you can obtain information about the underlying thread running a task, it is better to avoid doing so
2. Dispatch Queues 单行 并行 2种 FIFO 把task依次放入单行queue可以实现顺序执行
3. Operation Queues 可以指定任务之间的优先级 task之间的先后依赖关系
4. __block变量是可以改变的 共享的
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
for (__block int i = 0; i<10000; i++) {
dispatch_async(aQueue, ^{
NSLog(@"%d",i);
});
}
2011-07-05 17:11:38.346 ttt[41418:1803] 61
2011-07-05 17:11:38.346 ttt[41418:5f03] 1292
2011-07-05 17:11:38.348 ttt[41418:1803] 4096
2011-07-05 17:11:38.348 ttt[41418:5f03] 4954
2011-07-05 17:11:38.349 ttt[41418:1803] 5823
2011-07-05 17:11:38.349 ttt[41418:5f03] 6159
2011-07-05 17:11:38.349 ttt[41418:1803] 6575
2011-07-05 17:11:38.349 ttt[41418:5f03] 6634
2011-07-05 17:11:38.350 ttt[41418:1803] 7936
2011-07-05 17:11:38.350 ttt[41418:5f03] 8428
2011-07-05 17:11:38.351 ttt[41418:1803] 8895
2011-07-05 17:11:38.351 ttt[41418:5f03] 9364
2011-07-05 17:11:38.351 ttt[41418:1803] 9836
2011-07-05 17:11:38.351 ttt[41418:5f03] 10000
2011-07-05 17:11:38.354 ttt[41418:1803] 10000
5. 一般外部变量是copy正在运行时的外部状态
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
for (int i = 0; i<1000; i++) {
dispatch_async(aQueue, ^{
NSLog(@"%d",i);
});
}
2011-07-05 17:15:37.525 ttt[41697:1803] 0
2011-07-05 17:15:37.526 ttt[41697:1803] 2
2011-07-05 17:15:37.527 ttt[41697:1803] 3
2011-07-05 17:15:37.527 ttt[41697:1803] 4
2011-07-05 17:15:37.527 ttt[41697:1803] 5
2011-07-05 17:15:37.527 ttt[41697:1803] 6
2011-07-05 17:15:37.526 ttt[41697:5f03] 1
2011-07-05 17:15:37.530 ttt[41697:5f03] 8
2011-07-05 17:15:37.530 ttt[41697:5f03] 9
2011-07-05 17:15:37.530 ttt[41697:5f03] 10
2011-07-05 17:15:37.530 ttt[41697:5f03] 11
2011-07-05 17:15:37.532 ttt[41697:6203] 13
6. queue可以有结束时执行的方法
void myFinalizerFunction(){
NSLog(@"xxx");
}
- (void)viewDidLoad {
[superviewDidLoad];
dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_set_context(queue, @"xxx");
dispatch_set_finalizer_f(queue, &myFinalizerFunction);
for (int i = 0; i<1000; i++) {
dispatch_async(queue, ^{
NSLog(@"%d",i);
});
}
dispatch_release(queue);
7. dispatch_sync(queue,task) 会阻塞当前线程 直到queue完成了你给的task, 但queue要完成你给的task,因为queue是FIFO的,意味着要完成之前的任务,才有机会执行你刚才给的task, 相当于当前线程等待queue里面所有任务执行完毕, 所以这句话不能在当前queue的任务代码里面调用,会造成死锁
dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL);
dispatch_set_context(queue, @"xxx");
dispatch_set_finalizer_f(queue, &myFinalizerFunction);
for (int i = 0; i<10; i++) {
dispatch_async(queue, ^{
NSLog(@"%d",i);
});
}
NSLog(@"waiting");
dispatch_sync(queue, ^{
NSLog(@"wait done");
});
dispatch_release(queue);
2011-07-05 17:54:35.479 ttt[44203:207] waiting
2011-07-05 17:54:35.479 ttt[44203:1803] 0
2011-07-05 17:54:35.481 ttt[44203:1803] 1
2011-07-05 17:54:35.482 ttt[44203:1803] 2
2011-07-05 17:54:35.482 ttt[44203:1803] 3
2011-07-05 17:54:35.483 ttt[44203:1803] 4
2011-07-05 17:54:35.483 ttt[44203:1803] 5
2011-07-05 17:54:35.484 ttt[44203:1803] 6
2011-07-05 17:54:35.484 ttt[44203:1803] 7
2011-07-05 17:54:35.485 ttt[44203:1803] 8
2011-07-05 17:54:35.485 ttt[44203:1803] 9
2011-07-05 17:54:35.486 ttt[44203:207] wait done
2011-07-05 17:54:35.487 ttt[44203:1803] xxx
8. Waiting on Groups of Queued Tasks //dispatch_sync只能对一个queue等待
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
// Add a task to the group
dispatch_group_async(group, queue, ^{
NSLog(@"first task");
});
dispatch_queue_t otherqueue = dispatch_queue_create("com.example.MyQueue", NULL);
for (int i = 0; i<100; i++) {
dispatch_group_async(group, otherqueue, ^{
NSLog(@"otherqueue task");
});
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"end waiting");
dispatch_release(group);
2011-07-05 19:32:31.919 ttt[50138:5f03] otherqueue task
2011-07-05 19:32:31.919 ttt[50138:1803] first task
2011-07-05 19:32:31.922 ttt[50138:5f03] otherqueue task
2011-07-05 19:32:31.923 ttt[50138:5f03] otherqueue task
...
2011-07-05 19:32:32.078 ttt[50138:5f03] otherqueue task
2011-07-05 19:32:32.079 ttt[50138:5f03] otherqueue task
2011-07-05 19:32:32.080 ttt[50138:207] end waiting
9. Although you can obtain information about the underlying thread running a task, it is better to avoid doing so
发表评论
-
UIWebView清空缓存
2016-07-25 10:03 508- (void)clearAllUIWebViewData { ... -
iOS显示FPS值的工具FHHFPSIndicator
2016-07-04 13:56 0转载:http://www.cocoachina.com/io ... -
响应者链及相关机制总结
2016-06-30 14:25 507转载:http://www.cocoachina.com/i ... -
KVO&KVC的再次认知
2015-02-02 16:01 701KVO模型中,有两种通知观察者的方式,自动通知和手动通知。顾名 ... -
代码重构的理解(持续更新)
2015-01-13 17:27 581代码重构的理解和思考。 1:何时进行重构?当重复出现的时候,你 ... -
深入浅出Cocoa之Framework(转)
2015-01-06 17:49 0Framework 简介 转自 http://www.coc ... -
iOS静态库和动态库
2014-12-24 17:55 803一、什么是库? 库是共 ... -
svg图片在ios上的使用
2014-12-23 15:22 7261:从UI设计师那里得到的是每个svg图通过网站icomoon ... -
svg图片在ios上的使用
2014-12-23 15:22 32521:从UI设计师那里得到的是每个svg图通过网站icomoon ... -
Xcode设置项之Architectures和Valid Architectures
2014-12-22 10:42 621本文所讲的内容都是围绕iPhone的CPU指令集,现在先说说不 ... -
Xcode中Build Settings更改编译后能发现的问题
2014-12-17 13:36 7381:for循环不加括号 2:枚举赋值时类型不匹配 3:for循 ... -
静态库编译心得
2014-12-16 11:16 519我们编译静态库时一般会生成模拟器,真机两个包的.a文件 这二个 ... -
xcode编译选项整理
2014-12-11 19:15 0LINK_WITH_STANDARD_LIBRARIES = ... -
根据dsym解析crash_log
2014-12-01 14:15 9231:拷贝symbolicatecrash到/bin目录下 su ... -
autolayout心得
2014-10-28 13:30 684一:实现方案在以前就已经确定了下面几个点: 1 使 ... -
Objective-C的消息传递机制[转]
2014-07-31 20:34 665一直想写一篇类似的。 直接转载了 http://www.cnb ... -
iOS开发模拟限速
2012-12-07 17:47 53871. 模拟器网速调整: 限制时输入下面两行,根据需要修改下面的 ... -
iphone中结束电话后返回自己的应用(转载)
2012-04-10 10:30 1196iphone中结束电话后返回自己的应用 大家想不想在 ... -
Info.plist中常用的key简介(转载)
2012-03-15 15:55 939UIRequiresPersistentWiFi 在程序中弹出 ... -
UIScrollView 原理(转载)
2012-03-10 19:46 1161scroll view 原理 在滚动过程当中,其实是在修 ...
相关推荐
dispatch_queue_t serialQueue = dispatch_queue_create("com.example.serialQueue", DISPATCH_QUEUE_SERIAL); dispatch_async(serialQueue, ^{ // 任务1 }); dispatch_async(serialQueue, ^{ // 任务2 }); ``` 在...
简单的线程dome,适合初学者的使用, //dispatch_async(queue,^{});... //dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0) 得到全局队列 //diapatch_get_main_queue() 得到主线程,即UI队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ // 执行耗时操作 dispatch_sync(dispatch_get_main_queue(), ^{ // 更新UI }); }); ``` ...
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ // 执行后台任务 dispatch_sync(dispatch_get_main_queue(), ^{ // 更新UI }); }); ``` ...
- **自定义队列**:开发者可以创建自己的串行或并行队列,通过`dispatch_queue_create()`函数实现。 - ** dispatch_async**:用于异步执行任务,不会阻塞当前线程。 - **dispatch_sync**:用于同步执行任务,如果...
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // 执行耗时操作 dispatch_async(dispatch_get_main_queue(), ^{ // 更新UI }); }); ``` 这里的两个Block分别用于后台执行...
在《iOS并发编程指南》中,你将学习到如何利用GCD来实现并发,包括使用`dispatch_queue_create`创建队列、`dispatch_async`异步执行任务、`dispatch_sync`同步执行任务,以及如何使用barrier tasks来确保特定任务在...
dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(dispatchQueue, ^{ // 初始化音频播放器 NSURL *fileURL = [[NSBundle mainBundle] ...
- `work_queue_t *queue`:工作队列的指针。 #### 三、核心API 1. **`thrmgr_new`**:创建一个新的线程池实例。 - 参数: - `int max_threads`:线程池的最大线程数。 - `int idle_timeout`:线程空闲时的超时...
这个名为"IOS GCD-Program-master"的项目,显然旨在帮助开发者,即使是初学者,也能轻松掌握GCD的使用,包括线程操作、队列管理、定时器以及同步等待等功能。 1. **线程操作**:GCD提供了强大的并发编程工具,允许...
dispatch_async(dispatch_get_main_queue()) { self.imageView.image = downloadedImage } ``` 或者,如果使用了`detachNewThreadSelector`,则可以将UI更新操作作为目标方法的一部分,使用`self....
DispatchQueue.global(qos: .userInteractive) // 最高优先级 DispatchQueue.global(qos: .userInitiated) // 默认优先级 DispatchQueue.global(qos: .utility) // 较低优先级 DispatchQueue.global(qos: ....
DispatchQueue是GCD中用于管理任务队列的概念。它有两个主要类型:串行队列(Serial Queue)和并发队列(Concurrent Queue)。串行队列保证任务按照添加的顺序依次执行,而并发队列则允许任务同时执行。开发者需要...
ImagePickerDemo可能使用GCD来调度这些任务,例如用`dispatch_async`或`DispatchQueue.concurrentPerform`。 8. **UIImage与Core Graphics**:在处理图片时,开发者可能会使用Core Graphics框架来缩放、裁剪或处理...
DispatchQueue.global(qos: .background).async { // 背景任务 DispatchQueue.main.async { // 更新UI } } ``` 3. OperationQueue:基于GCD的高级抽象,支持操作依赖、取消、优先级等功能。 ```swift let ...
DispatchQueue.global().async { // 耗时操作... // 任务完成,隐藏指示器 DispatchQueue.main.async { hud.hide(animated: true) } } ``` 5. **自定义设置**:可以根据需要调整HUD的样式和行为。 ```...
DispatchQueue.global(qos: .background).async { // 模拟耗时操作 sleep(2) DispatchQueue.main.async { ProgressHUD.dismiss() // 在主线程中关闭加载指示器 } } ``` ProgressHUD提供了多种显示样式,包括...
6. **多线程处理**:异步操作和线程管理,如GCD(Grand Central Dispatch)或OperationQueue的使用,确保应用的流畅运行。 7. **错误处理与日志记录**:良好的错误处理和日志记录机制可以提高应用的稳定性和可维护...
GCD(Grand Central Dispatch)和OperationQueue是iOS中的并发工具,它们可以帮助开发者有效地利用多核处理器,执行异步任务。这部分源码可能包含如何使用这些技术的例子。 动画和过渡效果让应用更具吸引力。UIKit ...