在iOS中挂起主线程

移动开发 iOS
通常而言,ios中涉及IO的操作是多线程的,而不会在主线程中完成,这是为了避免耗时过长IO操作卡住主线程。

但某些时候,我们希望让主线程等待IO操作完成——例如主线程创建了一个文件夹后,等待完成,再往文件夹中创建文件。

NSObject类有一个方法performSelectorOnMainThread:withObject:waitUntilDone可以让主线程挂起,但selector至多只能带一个可传参数,这时需要用到NSInvocation类来解决这个问题。

代码如下: 

- (void)createRecordDirectoryBlockingMainThread

{

NSFileManager *dfm = [NSFileManager defaultManager];

SEL sel = @selector(createDirectoryAtPath:

withIntermediateDirectories:

attributes:

error:);

NSMethodSignature *sig = [dfm methodSignatureForSelector:sel];

//方法的签名,实际上包含了目标,选择器,及各参数的类型信息,但并不含有目标和方法的内存地址。这些信息是为了在函数压栈时准确得到各参数的值

NSInvocation *ivct = [NSInvocation invocationWithMethodSignature:sig];

[ivct setTarget:dfm];

[ivct setSelector:sel]; //提供方法的内存地址

FilePathManager *fpm = [FilePathManager sharedInstance];

NSString *path = fpm.programRecordDirectoryPath;

[ivct setArgument:&path atIndex:2]; //参数在数组中的索引从2开始

[ivct setArgument:(void *)&BOOL_NO atIndex:3]; //(void *)的类型转换可以避免编译器警告

[ivct setArgument:(void *)&ID_NIL atIndex:4];

[ivct setArgument:(void *)&VOID_NULL atIndex:5];

[ivct performSelectorOnMainThread:@selector(invoke)

withObject:nil

waitUntilDone:YES]; //挂起主线程

}

【编辑推荐】

  1. PhoneGap Xcode iOS入门教程
  2. iOS 5.1的Web存储方式改变会影响到Web App吗?
  3. Cocos2d-x跨Android&iOS平台开发入门
责任编辑:冰凝儿 来源: 博客园
相关推荐

2014-07-21 10:03:56

2011-06-22 15:42:18

QT 信号

2017-03-13 10:41:33

iOSUI操作主线程

2010-02-24 11:19:00

Python主线程

2010-02-01 17:33:24

Python主线程

2010-02-02 16:47:12

Python主线程

2010-03-01 13:28:44

Python子线程

2010-03-15 18:34:08

Java多线程

2010-02-26 15:37:11

Python主线程

2010-03-10 19:34:45

Python主线程

2009-07-16 08:53:03

Swing任务Swing线程

2013-03-27 10:32:53

iOS多线程原理runloop介绍GCD

2015-03-09 09:44:35

GmailiOS

2015-08-07 10:40:31

UI主线程

2014-04-23 13:30:23

类簇iOS开发

2011-04-02 13:57:05

Sql Server

2017-03-23 18:02:59

Android线程Tread

2010-03-03 17:52:31

Python线程同步

2011-08-10 10:18:22

iPhone多线程线程

2023-12-14 15:05:08

volatile代码C++
点赞
收藏

51CTO技术栈公众号