标签: grand-central-dispatch

取消在线程中工作的GCD块

我有以下块在后台执行请求.
如何在完成之前取消此请求?

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        NSData *thumbnailData = [NSURLConnection sendSynchronousRequest:request];
        ...
    });
Run Code Online (Sandbox Code Playgroud)

iphone objective-c grand-central-dispatch

0
推荐指数
2
解决办法
5057
查看次数

为什么GCD代码在drawRect中崩溃?

这是在drawRect内:

NSString *generated = [Entry generateString];

const char *cString = (const char*)[generated UTF8String];

dispatch_queue_t queue = dispatch_queue_create(cString, NULL);*/

dispatch_async(queue, ^{

    Media *media = [self.entry.media objectAtIndex:i];

    UIImage *image = [media getThumbnail];

    dispatch_async(dispatch_get_main_queue(), ^{

        int bottom = [JHomeViewCell yOfMessageBottomWithMessageHeight:self.cellInfo.messageHeight
                                                            withMonth:self.cellInfo.hasMonth];

        CGRect frame = CGRectMake(87 + (68 * i),
                                  bottom,
                                  THUMBNAIL_SIZE.width,
                                  THUMBNAIL_SIZE.height);

        [image drawInRect:frame];
    });

});
Run Code Online (Sandbox Code Playgroud)

现在,它在objectAtIndex行崩溃了.这不是一个无效的索引.代码在这里工作正常.

编辑:我收到此错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'statement is still active'
Run Code Online (Sandbox Code Playgroud)

编辑2:我放入NSLogs,第一个获得media.count.它崩溃了同样的错误.

iphone objective-c grand-central-dispatch ios

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

GCD串行队列是否使用所有CPU内核?

我想渲染30个不同的图像.每个任务必须将不同的图像层合并到一个最终图像 - 30个最终图像.

目前我使用GCD串行队列.现在我想知道这种方法是否自动使用所有可用内核的CPU功率?

或者,在使用GCD并发队列时,我可以改善所有这些任务的渲染时间吗?谢谢你澄清..

iphone multithreading grand-central-dispatch ios

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

dispatch_queue名称和线程

有一个按钮方法:

-(void) buttonTapped:(id) sender{
    dispatch_async(dispatch_queue_create("countQueue", NULL), ^{
        sleep(10);
        NSLog(@"%d",self.count++);
    });
}
Run Code Online (Sandbox Code Playgroud)

self.count是属性:

@property (nonatomic, assign) int count;
Run Code Online (Sandbox Code Playgroud)

我想通过点击按钮多次创建"countQueue",

  1. 为countQueue的处理任务运行了多少个线程?
  2. 因为块需要在10秒内运行,如果我每隔2秒点击一次按钮,那么它会创建一个新队列,系统如何处理前一个任务?刚取消它?

grand-central-dispatch ios

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

使用dispatch_get_global_queue时,非ARC'd项目需要dispatch_release

虽然使用GCD为后台线程创建的普通队列需要dispatch_release来释放对象的内存,但是由于取消分配全局队列可能会导致操作系统出现问题,因此需要完成获取全局队列的相同操作:是对于持有dispatch_get_global_queue获取的队列的引用的对象所需的dispatch_release,或者dispatch_source_cancel是否足够?

为了更深入地解决这个问题,我正在使用全局队列来设置计时器,让它们运行并触发一个事件,这个项目是非ARC'd的.

multithreading objective-c grand-central-dispatch ios

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

如果我将dispatch_barrier_(a)同步到一个以GCD中的全局并发队列为目标的队列,会发生什么?

我有一个关于dispatch_barrier和目标队列的问题.我有一个自定义串行队列和自定义并发队列,我将串行队列的目标队列设置为并发队列,然后该队列以全局并发队列为目标:

(serial queue) -> (concurrent queue) -> (global concurrent queue)
Run Code Online (Sandbox Code Playgroud)

当我dispatch_barrier在串行队列上阻塞时会发生什么?它是否会阻止提交到并发队列的块的执行,或仅阻止串行队列中的执行块?或者,如果我dispatch_barrier阻塞到非全局并发队列,它是否会阻止提交到串行队列的块的执行,还是只阻止非全局并发队列中块的执行?

感谢您的关注.:)

objective-c grand-central-dispatch objective-c-blocks

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

GCD:dispatch_queue_t的类型(dispatch_queue_s*)

有一个用户想知道这意味着什么的帖子:

@property (nonatomic, strong) __attribute__((NSObject)) dispatch_queue_t captureQueue;
Run Code Online (Sandbox Code Playgroud)

他应该得到一些错误,我想我会谷歌,因为我也感兴趣.

有一件事导致了另一件事,这引出了我的问题:

实际的类型是dispatch_queue_t什么?

我也做了一些谷歌搜索,过去在SO上发现了2个问题.一个基本上集中在后缀部分,即_t关于POSIX和C的历史,所以它没有回答我的问题.

另一个是接近的,但接受的答案基本上是说它是一个typedef,没有人应该知道.它是一个依赖于系统的类型,必须处理位.

这对我来说不是一个好奇的人.而且我认为必须有人知道或有人知道比我更好,所以我的问题在这里.


如果确实没有人知道,那么即使是一个答案,至少告诉我这个机制如何以抽象的方式工作以及如何确定其类型(BTW,运行时或编译时?)根据不同的位不同的操作系统仍然足以满足我.


我也只是看着queue.hblock.m,我发现了什么是只有这个小一条信息:

typedef struct dispatch_queue_s *dispatch_queue_t;
Run Code Online (Sandbox Code Playgroud)

queue.h,我看到了这个:


__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
void dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
#endif

__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_NA)
extern struct dispatch_queue_s _dispatch_main_q;
#define dispatch_get_main_queue() (&_dispatch_main_q)
Run Code Online (Sandbox Code Playgroud)

这超出了我的范围.我希望非常了解GCD的人可以分享一些关于此的知识.

grand-central-dispatch

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

如何使用Alamofire执行顺序请求并在Swift 3的每一步更新progressHUD

好的,我对这一个感到疯狂......

我正在使用Alamofire 4.x(Swift 3和XCode 8.1).我需要从需要身份验证的站点获取和解析几个html请求(不幸的是没有json API).然后用Fuzi解析HTML,这个进展可能需要一些时间,所以我打算使用ProgressHUD(准确地说PKHUD)让用户知道发生了什么.我还需要获取一些不在身份验证后面的html.

我创建了一个结构和函数来处理整个网络进程并解析数据.

我设法执行请求并获取我需要的数据,但我似乎无法弄清楚如何在正确的时间进行HUD更新.

到目前为止,这是我的代码:

import Alamofire
import Fuzi
import PKHUD

struct MyMSCProvider {

static let baseUrl = "http://mastersswimming.ca"

//I tried with or without a custom queue - same result
static let processingQueue = DispatchQueue(label: "com.colddiver.processing-queue", qos: .utility)

static func fetchData(data: MscRequest) {

    if data.profile || data.log {

        //Authenticate first!
        HUD.show(.labeledProgress(title: "Authenticating", subtitle: ""))

        let requestUrl = "\(baseUrl)/MyMscPage.jsp"
        let parameters = ["locale": "en", "username": data.user.username, "password": data.user.password]

        Alamofire.request(requestUrl, method: .post, parameters: parameters).responseData(
            queue: processingQueue,
            completionHandler:
            { …
Run Code Online (Sandbox Code Playgroud)

grand-central-dispatch alamofire swift3 xcode8.1

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

Swift 3.0:延迟不到一秒钟

我试图延迟不到一秒钟.我从网上找到了这段代码.然而,它不接受不到一秒的延迟.Swift中的Grand Dispatch Concept对我来说有点神秘.我应该如何修改此代码以创建0.3秒的延迟?

    let deadlineTime = DispatchTime.now() + .seconds(1) //how to get 0.3 seconds here
    DispatchQueue.main.asyncAfter(deadline: deadlineTime) {        
      //code here
    }
Run Code Online (Sandbox Code Playgroud)

grand-central-dispatch ios dispatch-async swift

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

为什么设置为后台的服务质量在主线程中运行?

为什么下面的代码在主线程中运行,虽然我已经为后台线程指定了qos?

func testQueue(){

    let queue = DispatchQueue(label: "com.appcoda.myqueue",qos:.background)
    queue.sync {

        if Thread.isMainThread{
            print("is in main thread")
        }else{
            print("is i background thread")
        }
        for i in 100..<110 {
            print("??", i)
        }
    }
}

testQueue()
Run Code Online (Sandbox Code Playgroud)

每当我尝试运行该方法时,我会在控制台中获取msg is in main thread,但不应该是这种情况.我正在阅读本文.

http://www.appcoda.com/grand-central-dispatch/

请参阅"调度队列入门"部分.

multithreading grand-central-dispatch ios swift

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