我正在尝试加速我的应用程序的启动,我的一个想法是使用异步调度队列.我有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
当我在iPhone 4上测试时,我有一些代码运行缓慢.我正在考虑研究Grand Central Despatch并使用后台线程执行某些任务.但是,据我所知,iPhone 4是单核设备.这是否意味着使用后台线程在此设备上没有任何好处?
我在Apple的文档中找不到关于这方面不同设备功能的内容,也不熟悉后台处理.
iphone cocoa-touch background-process grand-central-dispatch ios
我有一些代码需要一点时间来处理,因此它应该适当地不应该在主队列上运行.但是我不确定如何正确地"构建"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) 如果我像这样存储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
我明白dispatch_async()在后台线程上运行一些东西,然后dispatch_main()在主线程上运行它,那么它dispatch_sync()会在哪里进来?
为了同时执行两个任务,我创建了两个并发队列,并将一些块分派给两个队列.
这是我在主线程中所做的
-(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
我试图用这段代码做一个非常简单的延迟弹出到根视图控制器:
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
谢谢.
我已经阅读了这个答案,我不相信它有我想要的东西,但我是初学者,我很高兴有人在这个链接中指出答案: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这个目标,但它是我遇到最多的搜索.
这是我第一次使用GCD,我承认,很抱歉,如果我是愚蠢的.我有一个dispatch_after命令,对我来说是一个方便的延迟.
我的问题是,当我发送
dispatch_after(500000000000, dispatch_get_main_queue()){
println("triggered") //or any other code
}
Run Code Online (Sandbox Code Playgroud)
闭合被立即触发(例如我已经测试了这个并且立即触发了"触发"打印).它应该需要更长的时间吗?比500秒长.
谢谢 :)
DispatchTime和(NS)Date拥有该属性distantFuture,"在遥远的未来返回一个时间".
讨论:
您可以将此值传递给计划工作的方法,以使系统无限期地等待特定事件发生或满足条件.
我无法想到或找到一个我真正需要使用它的例子.什么是好用例?
ios ×8
swift ×3
concurrency ×2
iphone ×2
objective-c ×2
cocoa ×1
cocoa-touch ×1
foundation ×1
multitasking ×1
nsthread ×1