标签: grand-central-dispatch

主线程上的多个GCD调度

我正在尝试加速我的应用程序的启动,我的一个想法是使用异步调度队列.我有2个任务可以在启动时彼此相邻运行(实际上是非常大的任务).但是,它们都有一个在主线程上运行的重要部分(主要是UI代码).

dispatch_async(dispatch_get_main_queue, ^{
    [self doTask1];
});

dispatch_async(dispatch_get_main_queue, ^{
    [self doTask2];
    //Will task 2 take turns with task 1, or will task 2 start after 1 is finished?
});
Run Code Online (Sandbox Code Playgroud)

我的问题是:如果我在启动时调用2个dispatch_async,就像在这个例子中一样,它们会轮流执行,还是先完成第一个块,然后执行第二个块?

iphone multithreading objective-c grand-central-dispatch ios

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

我可以在iPhone 4上使用GCD吗?

当我在iPhone 4上测试时,我有一些代码运行缓慢.我正在考虑研究Grand Central Despatch并使用后台线程执行某些任务.但是,据我所知,iPhone 4是单核设备.这是否意味着使用后台线程在此设备上没有任何好处?

我在Apple的文档中找不到关于这方面不同设备功能的内容,也不熟悉后台处理.

iphone cocoa-touch background-process grand-central-dispatch ios

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

Objective-C - 构建用于后台处理的GCD代码

我有一些代码需要一点时间来处理,因此它应该适当地不应该在主队列上运行.但是我不确定如何正确地"构建"GCD代码段.即每次应用程序变为活动状态我都在进行同步操作:

AppDelegate.m

- (void)applicationDidBecomeActive:(UIApplication *)application {

    AddressBookHelper *abHelper = [AddressBookHelper sharedInstance]; // singleton helper class of NSObject

    [abHelper sync];
}
Run Code Online (Sandbox Code Playgroud)

AddressBookHelper中的同步代码如下所示:

AddressBookHelper.m

- (void)sync {

    NSArray *people = // Fetching some people from Core Data

    NSMutableArray *syncConflicts;
    // Start doing some business logic, iterating over data and so on

    for (id object in people) {
    // Process some data
        [syncConflicts addObject:object];
    }

    self.syncConflicts = syncConflicts;

    // I have separated this method to keep the code cleaner and to separate the …
Run Code Online (Sandbox Code Playgroud)

cocoa objective-c grand-central-dispatch

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

在dispatch_queue_t上调用执行是否确保它们在同一个线程上?

如果我像这样存储dispatch_queue_t:

@property(assign, nonatomic) dispatch_queue_t myQueue;
Run Code Online (Sandbox Code Playgroud)

...

_myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
Run Code Online (Sandbox Code Playgroud)

后来,当我做手术时

dispatch_async(_myQueue, ^{
  NSLog(@"Hi!");
});
Run Code Online (Sandbox Code Playgroud)

然后在其他地方

dispatch_async(_myQueue, ^{
  NSLog(@"Hello!");
});
Run Code Online (Sandbox Code Playgroud)

这些块是在同一个线程上执行的吗?如果没有,我该如何确保它们?基本上我想保留对线程的引用,并使其仅在该线程上执行某些操作.

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

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

dispatch_sync和dispatch_main有什么区别?

我明白dispatch_async()在后台线程上运行一些东西,然后dispatch_main()在主线程上运行它,那么它dispatch_sync()会在哪里进来?

concurrency multithreading grand-central-dispatch ios

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

为什么DISPATCH_QUEUE_CONCURRENT创建的两个并发队列不同时运行?

为了同时执行两个任务,我创建了两个并发队列,并将一些块分派给两个队列.

这是我在主线程中所做的

-(IBAction)btn_Pressed:(id)sender
{
    dispatch_queue_t queue_a = dispatch_queue_create("com.gcd_demoA", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t queue_b = dispatch_queue_create("com.gcd_demoB", DISPATCH_QUEUE_CONCURRENT);

    dispatch_sync(queue_a, ^{
        NSLog(@"A - 1");
    });

     dispatch_sync(queue_a, ^{
        NSLog(@"A - 2");
    });

    dispatch_sync(queue_a, ^{
        NSLog(@"A - 3");
    });

    dispatch_sync(queue_b, ^{
        NSLog(@"B - 1");
    });

    dispatch_sync(queue_b, ^{
        NSLog(@"B - 2");
    });

    dispatch_sync(queue_b, ^{
        NSLog(@"B - 3");
    });
}
Run Code Online (Sandbox Code Playgroud)

但是,令人惊讶的是我总是得到以下输出:

A - 1  
A - 2  
A - 3  
B - 1  
B - 2  
B - 3  
Run Code Online (Sandbox Code Playgroud)

为什么这两个并发队列不同时执行?

这是Apple文档所说的(参考):

提交到串行队列的块按FIFO顺序一次执行一个.但是,请注意,提交给独立队列的块可以相互同时执行.提交到并发队列的块以FIFO顺序出列,但如果有资源可以同时运行.

所以,根据这个语句,在我的情况下,无论队列A中发生了什么,队列B的块都应该执行.意思是,完全独立于队列A.但是,为什么队列B的块不会开始执行直到所有队列A完成.

如果某些事情被误解,请纠正我.

concurrency multithreading multitasking grand-central-dispatch ios

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

dispatch_after错误:'[AnyObject]?' 不是'Void'的子类型

我试图用这段代码做一个非常简单的延迟弹出到根视图控制器:

let delay = 1 * Double(NSEC_PER_SEC)
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(time, dispatch_get_main_queue(), {
  self.navigationController?.popToRootViewControllerAnimated(true)
})
Run Code Online (Sandbox Code Playgroud)

然而我得到的错误'[AnyObject]?' is not a subtype of 'Void'我认为它与调用self.navigationController块/闭包内部有关,因为如果我注释掉那行并用println("Will this compile")它替换就行了.

有人可以解释为什么我收到这个错误,以及实现我想要做的正确方法是什么?

Xcode 6.1.1

谢谢.

grand-central-dispatch ios swift

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

使用Grand Central Dispatch每天同一时间安排一项功能

我已经阅读了这个答案,我不相信它有我想要的东西,但我是初学者,我很高兴有人在这个链接中指出答案:dispatch_after - 迅捷的GCD?

我的目标:设置一个功能,每天在用户的时区(或系统的时区)上午9点运行.

我已经非常简单地使用GCD来延迟一个函数如下(它工作得非常好):

    var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(10 * Double(NSEC_PER_SEC)))
    dispatch_after(dispatchTime, dispatch_get_main_queue(), {
        let alert = UIAlertView()
        alert.title = "Foo Alert"
        alert.message = "foo."
        alert.addButtonWithTitle("OK")
        alert.show()

        AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
    });
Run Code Online (Sandbox Code Playgroud)

所以我想像我上面提到的那样每天开火,但是我坚持的第一件事是将DISPATCH_TIME_NOW换成时区相关值?我是否甚至需要考虑时区或者只是用军队09:00替换DISPATCH_TIME_NOW就足够了?

此外,任何关于总体目标的建议,每天同一时间安排起火功能都将非常感激.

我也没有结婚使用GCD这个目标,但它是我遇到最多的搜索.

grand-central-dispatch ios swift

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

dispatch_after时间立即触发

这是我第一次使用GCD,我承认,很抱歉,如果我是愚蠢的.我有一个dispatch_after命令,对我来说是一个方便的延迟.

我的问题是,当我发送

dispatch_after(500000000000, dispatch_get_main_queue()){
    println("triggered") //or any other code
}
Run Code Online (Sandbox Code Playgroud)

闭合被立即触发(例如我已经测试了这个并且立即触发了"触发"打印).它应该需要更长的时间吗?比500秒长.

谢谢 :)

grand-central-dispatch swift

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

使用remoteFuture的实际例子是什么?

DispatchTime和(NS)Date拥有该属性distantFuture,"在遥远的未来返回一个时间".

讨论:

您可以将此值传递给计划工作的方法,以使系统无限期地等待特定事件发生或满足条件.

我无法想到或找到一个我真正需要使用它的例子.什么是好用例?

foundation grand-central-dispatch ios

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