我在使用内置的Xcode单元测试框架SenTestingKit测试一些宏的中央调度代码时遇到了一些麻烦.我成功地解决了我的问题.我有一个单元测试,它构建一个块并尝试在主线程上执行它.但是,该块永远不会被实际执行,因此测试会挂起,因为它是同步调度.
- (void)testSample {
dispatch_sync(dispatch_get_main_queue(), ^(void) {
NSLog(@"on main thread!");
});
STFail(@"FAIL!");
}
Run Code Online (Sandbox Code Playgroud)
什么是导致它挂起的测试环境?
这与我之前提出的问题有关,但不同之处,我认为我会把它扔进一个新问题.我有一些代码在自定义队列上运行异步,然后在完成时在主线程上执行完成块.我想围绕这种方法编写单元测试.我的方法MyObject看起来像这样.
+ (void)doSomethingAsyncThenRunCompletionBlockOnMainQueue:(void (^)())completionBlock {
dispatch_queue_t customQueue = dispatch_queue_create("com.myObject.myCustomQueue", 0);
dispatch_async(customQueue, ^(void) {
dispatch_queue_t currentQueue = dispatch_get_current_queue();
dispatch_queue_t mainQueue = dispatch_get_main_queue();
if (currentQueue == mainQueue) {
NSLog(@"already on main thread");
completionBlock();
} else {
dispatch_async(mainQueue, ^(void) {
NSLog(@"NOT already on main thread");
completionBlock();
});
}
});
Run Code Online (Sandbox Code Playgroud)
}
我投入了主队列测试以获得额外的安全性,但它总是能够击中dispatch_async.我的单元测试如下所示.
- (void)testDoSomething {
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
void (^completionBlock)(void) = ^(void){
NSLog(@"Completion Block!");
dispatch_semaphore_signal(sema);
};
[MyObject doSomethingAsyncThenRunCompletionBlockOnMainQueue:completionBlock];
// Wait for async code to finish
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); …Run Code Online (Sandbox Code Playgroud) 这看起来很怪异.我似乎无法在创建时成功设置NSURLSession的delegateQueue.
- (void)viewDidLoad
{
[super viewDidLoad];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 5;
NSLog(@"The queue before: %@", queue);
NSLog(@"Max op Count before: %i", queue.maxConcurrentOperationCount);
NSURLSession *session = [NSURLSession sessionWithConfiguration:nil
delegate:self
delegateQueue:queue];
NSLog(@"The queue after: %@", session.delegateQueue);
NSLog(@"Max op Count after : %i", session.delegateQueue.maxConcurrentOperationCount);
}
Run Code Online (Sandbox Code Playgroud)
这导致以下输出.
The queue before: <NSOperationQueue: 0x16d99160>{name = 'NSOperationQueue 0x16d99160'}
Max op Count before: 5
The queue after: <NSOperationQueue: 0x16d77a50>{name = 'NSOperationQueue 0x16d77a50'}
Max op Count after : 1
Run Code Online (Sandbox Code Playgroud)
看起来我delegateQueue被忽略了.我已尝试过该设备以及模拟器.我还没有找到任何可以解释这一点的文档.有没有人有任何见解?
我想检测键盘是否正在显示.我发现了一些其他帖子遍历UIWindow的子视图以找到键盘,但如果这是唯一的方法,那么我会找出其他的东西.我想我也可以观察UIKeyboard通知,但我猜这里有一个更清洁的解决方案.