标签: grand-central-dispatch

无法访问dispatch_async中的全局变量:"变量不可分配(缺少_block类型说明符)"

在我的dispach_async代码中,block我无法访问global variables.我收到了这个错误Variable is not Assignable (missing _block type specifier).

NSString *textString;

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
   (unsigned long)NULL), ^(void) {
        textString = [self getTextString];
});
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我找出原因吗?

multithreading objective-c grand-central-dispatch ios objective-c-blocks

49
推荐指数
1
解决办法
3万
查看次数

(iOS)dispatch_async()与NSOperationQueue

感谢Stanford的CS193p课程(在iTunes U上)以及Big Nerd Ranch的iOS编程书,我学习了iOS编程.在这两个,他们建议使用dispatch_async(),dispatch_get_main_queue()等来处理线程和并发操作.但是,在WWDC 2012关于构建并发UI的会议上,发言人建议使用NSOperationQueue.

dispatch_*()和之间NSOperationQueue有什么区别,有什么理由(技术,性能,风格或其他方面)我应该使用另一个吗?是否NSOperationQueue只是一个Objective-C的包装器dispatch_async,或者是有更多的什么原因呢?

nsoperationqueue grand-central-dispatch

48
推荐指数
3
解决办法
1万
查看次数

Grand Central Dispatch(GCD)与performSelector - 需要更好的解释

我在我的应用程序中使用了GCD和performSelectorOnMainThread:waitUntilDone,并且倾向于认为它们是可互换的 - 也就是说,performSelectorOnMainThread:waitUntilDone是GCD C语法的Obj-C包装器.我一直在考虑这两个命令是等价的:

dispatch_sync(dispatch_get_main_queue(), ^{ [self doit:YES]; });


[self performSelectorOnMainThread:@selector(doit:) withObject:YES waitUntilDone:YES];
Run Code Online (Sandbox Code Playgroud)

我不对吗?也就是说,performSelector*命令与GCD命令有区别吗?我已经阅读了很多关于它们的文档,但还没有看到明确的答案.

iphone multithreading objective-c grand-central-dispatch ios

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

获取当前的调度队列?

我有一个方法应该支持从任何队列调用,并应该期望.它在后台线程本身运行一些代码,然后在它返回一个值的块参数时使用dispatch_get_main_queue.我不希望它强制它进入主队列,如果不是它进入方法时.有没有办法获得指向当前调度队列的指针?

iphone objective-c dispatch grand-central-dispatch ios

45
推荐指数
6
解决办法
4万
查看次数

dispatch_async(dispatch_get_main_queue(),^ {...}); 等到完成?

我的应用程序中有一个场景,我想在一个方法中做一些耗费时间的任务,其中包括一些数据处理和UI更新.我的方法看起来像这样,

- (void)doCalculationsAndUpdateUIs {

    // DATA PROCESSING 1
    // UI UPDATE 1

    // DATA PROCESSING 2
    // UI UPDATE 2

    // DATA PROCESSING 3
    // UI UPDATE 3
} 
Run Code Online (Sandbox Code Playgroud)

由于耗时我想在后台线程上进行数据处理,使用,

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
Run Code Online (Sandbox Code Playgroud)

但由于数据处理和UI更新都采用相同的方法,我只想在主线程中使用UI更新,

dispatch_async(dispatch_get_main_queue(), ^{
Run Code Online (Sandbox Code Playgroud)

最后我的方法看起来像这样,

- (void)doCalculationsAndUpdateUIs {

    // DATA PROCESSING 1 
    dispatch_async(dispatch_get_main_queue(), ^{
        // UI UPDATE 1
    });

    /* I expect the control to come here after UI UPDATE 1 */

    // DATA PROCESSING 2
    dispatch_async(dispatch_get_main_queue(), ^{
        // UI UPDATE 2
    });

    /* I expect the control …
Run Code Online (Sandbox Code Playgroud)

multithreading objective-c grand-central-dispatch ios dispatch-async

44
推荐指数
3
解决办法
11万
查看次数

dispatch_get_global_queue和dispatch_queue_create有什么区别?

我正在编写一个中等复杂的iOS程序,需要为一些较长的操作(解析,连接到网络等)提供多个线程.不过,我很困惑,不同的是什么之间dispatch_get_global_queuedispatch_queue_create.

我应该使用哪一个,你能给我一个简单的解释,一般来说有什么区别吗?谢谢.

multithreading objective-c grand-central-dispatch ios

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

dispatch_get_global_queue vs dispatch_get_main_queue

开始学习核心数据和dispatch_async.有一段代码可以从数据集中获取图像的url,并将其设置为核心数据的模型,如下所示

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
                NSString *urlString = [[[photoDictionary valueForKey:@"images"] objectAtIndex:0] valueForKey:@"url"];
                NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
                dispatch_async(dispatch_get_main_queue(), ^{
                    [photoModel setValue:imageData forKey:@"photoImageData"];
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释为什么我们使用dispatch_get_global_queue外部dispatch_async和dispatch_get_main_queue内部dispatch_async.

objective-c grand-central-dispatch ios

42
推荐指数
3
解决办法
5万
查看次数

使用dispatch_async与self

在将Objective-C代码移植到Swift时,我遇到过几次这个问题.说我有以下代码:

dispatch_async(dispatch_get_main_queue()) {
    self.hostViewController?.view.addSubview(self.commandField)
}
Run Code Online (Sandbox Code Playgroud)

这将导致错误,强调整个dispatch_async通话,提供:

Could not find member 'addSubview'
Run Code Online (Sandbox Code Playgroud)

我认为这是一个尚未正确实现的错误,因为如果我将addSubview调用放在dispatch_async块外,项目构建正常.最初我认为它可能与self块中的捕获有关.但是,插入[unowned self] in结果会产生相同的错误[weak self] in(在!插入适当的展开操作符之后).

如何dispatch_async在Swift中获取需要捕获的块self

grand-central-dispatch swift

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

主队列上的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万
查看次数

dispatch_semaphore_dispose上的EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)

我在dispatch_semaphore_dispose上获得了EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0),但实际上并不知道如何找到它的根本原因.我的代码使用dispatch_async,dispatch_group_enter等.

更新:崩溃的原因是由于webserviceCall(请参阅下面的代码)从不调用onCompletion,并且当代码再次运行时,我收到错误EXC_BAD_INSTRUCTION.我确认情况确实如此,但不确定为什么或如何防止这种情况.

在此输入图像描述

码:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_group_t group = dispatch_group_create();

     for (...) {
        if (...) {
            dispatch_group_enter(group);
            dispatch_async(queue, ^{

               [self webserviceCall:url onCompletion:^{
                     dispatch_group_leave(group);
               }];
            });
        }
    }

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)));
    dispatch_sync(queue, ^{
        // call completion handler passed in by caller
    });
});
Run Code Online (Sandbox Code Playgroud)

exception objective-c grand-central-dispatch ios

40
推荐指数
4
解决办法
9万
查看次数