小编Dre*_*its的帖子

主队列上的dispatch_sync在单元测试中挂起

我在使用内置的Xcode单元测试框架SenTestingKit测试一些宏的中央调度代码时遇到了一些麻烦.我成功地解决了我的问题.我有一个单元测试,它构建一个块并尝试在主线程上执行它.但是,该块永远不会被实际执行,因此测试会挂起,因为它是同步调度.

- (void)testSample {

    dispatch_sync(dispatch_get_main_queue(), ^(void) {
        NSLog(@"on main thread!");
    });

    STFail(@"FAIL!");
}
Run Code Online (Sandbox Code Playgroud)

什么是导致它挂起的测试环境?

objective-c grand-central-dispatch sentestingkit

41
推荐指数
4
解决办法
2万
查看次数

单元测试异步队列的模式,在完成时调用主队列

这与我之前提出的问题有关,但不同之处,我认为我会把它扔进一个新问题.我有一些代码在自定义队列上运行异步,然后在完成时在主线程上执行完成块.我想围绕这种方法编写单元测试.我的方法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)

objective-c grand-central-dispatch sentestingkit

32
推荐指数
4
解决办法
1万
查看次数

NSURLSession委派队列

这看起来很怪异.我似乎无法在创建时成功设置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被忽略了.我已尝试过该设备以及模拟器.我还没有找到任何可以解释这一点的文档.有没有人有任何见解?

objective-c nsurlsession

9
推荐指数
1
解决办法
6208
查看次数

检测UIKeyBoard是否正在显示

我想检测键盘是否正在显示.我发现了一些其他帖子遍历UIWindow的子视图以找到键盘,但如果这是唯一的方法,那么我会找出其他的东西.我想我也可以观察UIKeyboard通知,但我猜这里有一个更清洁的解决方案.

iphone uikeyboard

2
推荐指数
1
解决办法
5243
查看次数