我对此代码有疑问
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData* data = [NSData dataWithContentsOfURL:
kLatestKivaLoansURL];
[self performSelectorOnMainThread:@selector(fetchedData:)
withObject:data waitUntilDone:YES];
});
Run Code Online (Sandbox Code Playgroud)
这段代码的第一个参数是
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
Run Code Online (Sandbox Code Playgroud)
我们是否要求此代码在全局队列上执行串行任务,其定义本身是返回给定优先级的全局并发队列?
使用dispatch_get_global_queue主队列有什么好处?
我很迷惑.你能帮我更好地理解这个吗?
我在Swift 2.x(甚至1.x)项目中有很多代码,如下所示:
// Move to a background thread to do some long running work
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
let image = self.loadOrGenerateAnImage()
// Bounce back to the main thread to update the UI
dispatch_async(dispatch_get_main_queue()) {
self.imageView.image = image
}
}
Run Code Online (Sandbox Code Playgroud)
或者像这样的东西来延迟执行:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
print("test")
}
Run Code Online (Sandbox Code Playgroud)
或者Grand Central Dispatch API的各种其他用途......
现在我已经在Swift 3的Xcode 8(beta)中打开了我的项目,我得到了各种各样的错误.其中一些提供修复我的代码,但并非所有修复产生工作代码.我该怎么办?
libdispatch grand-central-dispatch dispatch-async swift swift3
我一直在使用我的应用程序中的成功,宏大的中央调度,但我想知道使用这样的东西的真正优势是什么:
dispatch_async(dispatch_get_main_queue(), ^{ ... do stuff
Run Code Online (Sandbox Code Playgroud)
甚至
dispatch_sync(dispatch_get_main_queue(), ^{ ... do stuff
Run Code Online (Sandbox Code Playgroud)
我的意思是,在这两种情况下,你都要触发一个块来在主线程上执行,确切地说应用程序在哪里运行,这无助于减少负载.在第一种情况下,当块运行时,您没有任何控制权.我已经看到在你开火后半秒执行块的情况.第二种情况,它类似于
[self doStuff];
Run Code Online (Sandbox Code Playgroud)
对?
我想知道你们的想法是什么.
我的应用程序中有一个场景,我想在一个方法中做一些耗费时间的任务,其中包括一些数据处理和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
这段代码意味着什么?
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
TMBaseParser *parser=[[TMBaseParser alloc] init];
parser.delegate=self;
NSString *post =nil;
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding];
[parser parseForServiceType:TMServiceCategories postdata:postData];
});
Run Code Online (Sandbox Code Playgroud)
请简要解释一下.谢谢
我有这个代码:
DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default).async {
let url = URL(string: itemImageURL )
let data = try? Data(contentsOf: url!)
if data != nil {
DispatchQueue.main.async{
cell.advImage!.image = UIImage(data: data!)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在Swift 3中收到此警告:
在iOS 8.0中不推荐使用"default":改为使用qos属性
在第一行.
还没有找到解决方案.有人吗?
以下代码是否在主线程上运行?"主队列"是指主线程吗?
dispatch_async(dispatch_get_main_queue(),
^{
// Some code
});
Run Code Online (Sandbox Code Playgroud) 我读了其他帖子,提出了这个问题的解决方案.但是,他们的解决方案需要将hacky代码添加到我的应用程序中才能进行测试.对我来说,清洁代码比单元测试更重要.
我经常在我的应用程序中使用dispatch_async,我在单元测试时遇到了麻烦.问题是我的测试完成后块执行,因为它在主队列上异步运行.有没有办法以某种方式等待块执行,然后继续测试.
我不想仅仅因为单元测试而将完成传递给块
- (viod)viewDidLoad
{
[super viewDidLoad];
// Test passes on this
[self.serviceClient fetchDataForUserId:self.userId];
// Test fails on this because it's asynchronous
dispatch_async(dispatch_get_main_queue(), ^{
[self.serviceClient fetchDataForUserId:self.userId];
});
}
- (void)testShouldFetchUserDataUsingCorrectId
{
static NSString *userId = @"sdfsdfsdfsdf";
self.viewController.userId = userId;
self.viewController.serviceClient = [[OCMockObject niceMockForClass:[ServiceClient class]];
[[(OCMockObject *)self.viewController.serviceClient expect] fetchDataForUserId:userId];
[self.viewController view];
[(OCMockObject *)self.viewController.serviceClient verify];
}
Run Code Online (Sandbox Code Playgroud) 这总是以1 5 2 4 3的顺序打印吗?
print("1")
DispatchQueue.main.async {
print("2")
DispatchQueue.main.async {
print(3)
}
print("4")
}
print("5")
Run Code Online (Sandbox Code Playgroud)
我觉得答案是否定的,但我无法解释,希望有人能澄清我的理解.谢谢!
asynchronous grand-central-dispatch ios dispatch-async swift
我有一个相当简单的应用程序,它解析RSS提要并在表格视图中显示它的内容.它可以在App Store上找到.我整合了Crashlytics崩溃报告.我最近收到两份报告.这些有点难以破译.
这发生在运行iOS 10.2.1的iPhone 6中.
这是来自运行iOS 10.2.1的iPhone 5.
虽然它说它因隐私侵犯而崩溃,但我没有访问任何需要我的应用程序权限的服务.
另外搜索com.apple.root.default-qos让我相信这可能与后台线程有关.我使用后台线程的唯一地方是解析RSS提要数据.
DispatchQueue.global(qos: .background).async {
guard let data = try? Data(contentsOf: URL) else {
return
}
do {
let xmlDoc = try AEXMLDocument(xml: data)
if let items = xmlDoc.root["channel"]["item"].all {
self.posts.removeAll()
for item in items {
let title = item["title"].value ?? ""
// ...
self.posts.append(jobPost)
}
DispatchQueue.main.async {
self.saveposts(self.posts)
self.posts.sort { $0.publishDate > $1.publishDate }
self.tableView.reloadData()
UIApplication.shared.toggleNetworkActivityIndicator(show: false)
self.toggleUI(enable: true)
if self.refreshControl.isRefreshing { self.refreshControl.endRefreshing() }
}
}
} catch let …Run Code Online (Sandbox Code Playgroud) multithreading grand-central-dispatch ios dispatch-async swift
dispatch-async ×10
ios ×6
objective-c ×4
swift ×3
asynchronous ×2
swift3 ×2
concurrency ×1
libdispatch ×1
unit-testing ×1
warnings ×1