标签: dispatch-async

了解dispatch_async

我对此代码有疑问

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主队列有什么好处?

我很迷惑.你能帮我更好地理解这个吗?

asynchronous objective-c dispatch-async

230
推荐指数
3
解决办法
23万
查看次数

如何在Swift 3,Swift 4及更高版本中dispatch_sync,dispatch_async,dispatch_after等?

我在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

230
推荐指数
6
解决办法
18万
查看次数

iPhone - Grand Central Dispatch主线程

我一直在使用我的应用程序中的成功,宏大的中央调度,但我想知道使用这样的东西的真正优势是什么:

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)

对?

我想知道你们的想法是什么.

concurrency grand-central-dispatch ios dispatch-async

145
推荐指数
5
解决办法
14万
查看次数

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万
查看次数

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)

请简要解释一下.谢谢

ios dispatch-async

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

发送异步的Swift 3警告

我有这个代码:

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属性

在第一行.

还没有找到解决方案.有人吗?

warnings ios dispatch-async deprecation-warning swift3

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

使用dispatch_get_main_queue()是否意味着我的代码将在主线程上?

以下代码是否在主线程上运行?"主队列"是指主线程吗?

dispatch_async(dispatch_get_main_queue(),
^{
   // Some code
});
Run Code Online (Sandbox Code Playgroud)

objective-c grand-central-dispatch dispatch-async

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

Objective C - 单元测试dispatch_async块?

我读了其他帖子,提出了这个问题的解决方案.但是,他们的解决方案需要将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)

unit-testing objective-c dispatch-async

15
推荐指数
2
解决办法
6088
查看次数

Swift异步打印命令?

这总是以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

15
推荐指数
2
解决办法
840
查看次数

坠毁:com.apple.root.default-qos

我有一个相当简单的应用程序,它解析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

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