Dou*_*ith 53 multithreading asynchronous objective-c grand-central-dispatch ios
在最长的时间里,我认为异步是在后台线程上运行某些东西的同义词,而同步意味着在主线程上(阻止UI更新和交互).我明白,不在主线程上运行昂贵的操作是因为它不允许在主线程被占用时发生UI操作,但为什么同步麻烦?
但是,我注意到你可以在主线程上进行异步调用,在后台线程上进行同步调用.
我总是听到人们说不要同步或在主线程上使用昂贵的调用,因为它会阻止用户的UI.这两个不同的问题我应该确保我不这样做吗?有什么区别?
Rob*_*Rob 106
当您同步调用某些内容时,这意味着启动该操作的线程将在继续之前等待任务完成.异步意味着它不会等待.
话虽如此,当人们建议您异步执行一些缓慢或昂贵的过程时,他们隐含地建议您不仅应该异步运行它,而且应该在后台线程上执行此操作.目标是释放主线程,以便它可以继续响应用户界面(而不是冻结),因此您可以异步地将任务分派给后台线程.
所以,有两个部分.首先,使用GCD作为示例,您获取后台队列(获取一个全局后台队列,或创建自己的队列):
// one of the global concurrent background queues
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// or you could create your own serial background queue:
//
// dispatch_queue_t queue = dispatch_queue_create("com.domain.app.queuename", 0);
Run Code Online (Sandbox Code Playgroud)
其次,您将任务异步调度到该队列:
dispatch_async(queue, ^{
// the slow stuff to be done in the background
});
Run Code Online (Sandbox Code Playgroud)
操作队列的模式非常相似.创建操作队列并向该队列添加操作.
实际上,同步与异步的区别与主队列与后台队列的区别完全不同.但是当人们谈论"异步运行一些缓慢的进程"时,他们真的说"在后台队列上异步运行一些缓慢的进程".
Chu*_*uck 28
"同步"实质上意味着"按顺序".基本上,当您执行同步操作时,稍后出现的所有内容都必须等待操作完成才能启动.
相反,"异步"或多或少意味着"不按顺序".当您异步执行某些操作时,以下代码可以立即运行,并且异步操作将在某个时间运行.它可能与另一个线程上的其余代码并行运行.它可能只是安排在同一个线程上的其他时间.
同步性的概念本身与特定线程没有任何关系.这是关于你是否必须等待手术完成.
主线程在很大程度上涉及到Cocoa(Touch)程序.AppKit在主线程上运行主事件循环,因此如果主线程正在等待操作完成,则它无法处理任何输入或更新UI.但是,如果在后台线程上运行了一段代码,则运行同步代码不会阻止主事件循环,因为它不是等待同步操作完成的主线程.
类似地,从主线程放置的后台线程长时间运行的异步操作可能会导致问题,因为后台线程不会等待操作完成,它仍然占用主线程的时间需要运行事件循环的位置.
Kun*_*ani 16
让我们举一些简单的例子:
多线程异步调用:
// Methods gets called in different thread and does not block the current thread.
[NSURLConnection sendAsynchronousRequest:request
queue:queue
completionHandler:
^(NSURLResponse *response, NSData *data, NSError *error) {
}];
多线程同步调用:
//Do something
dispatch_sync(queue, ^{
//Do something else
});
//Do More Stuff
在这里你做了//做某事//做其他事情和//连续做更多事情,即使//在另一个线程上做了别的事.
通常,当人们使用不同的线程时,整个目的是让某些东西可以在不等待的情况下执行.假设您要下载大量数据,但希望保持UI流畅.
因此,很少使用dispatch_sync.但它就在那里.我个人从未使用过.为什么不要求使用dispatch_sync的示例代码或项目.
一个线程的异步调用:
[self performSelector:@selector(doSomething) withObject:nil afterDelay:0];
这里调用当前的runloop在'doSomething'之前完成.换句话说,在调用'doSomething'之前,可以完成当前调用堆栈(当前方法返回).
使用一个线程进行同步调用:
[self doSomething];
我认为你不需要解释.
通常,异步活动与线程不同,但在iOS中,它们是使用这种方式实现的.它并非适用于所有语言.我们通常使用运行循环管理不同的异步任务.
swift 3、4、4、2 同步意味着启动该操作的线程将等待任务完成后再继续。
DispatchQueue.main.sync {
}
Run Code Online (Sandbox Code Playgroud)
异步意味着在后台完成任务,并且可以在完成时通知您,这意味着它不会等待。
DispatchQueue.main.async {
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
69660 次 |
| 最近记录: |