我有以下块在后台执行请求.
如何在完成之前取消此请求?
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) 这是在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.它崩溃了同样的错误.
我想渲染30个不同的图像.每个任务必须将不同的图像层合并到一个最终图像 - 30个最终图像.
目前我使用GCD串行队列.现在我想知道这种方法是否自动使用所有可用内核的CPU功率?
或者,在使用GCD并发队列时,我可以改善所有这些任务的渲染时间吗?谢谢你澄清..
有一个按钮方法:
-(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",
虽然使用GCD为后台线程创建的普通队列需要dispatch_release来释放对象的内存,但是由于取消分配全局队列可能会导致操作系统出现问题,因此需要完成获取全局队列的相同操作:是对于持有dispatch_get_global_queue获取的队列的引用的对象所需的dispatch_release,或者dispatch_source_cancel是否足够?
为了更深入地解决这个问题,我正在使用全局队列来设置计时器,让它们运行并触发一个事件,这个项目是非ARC'd的.
我有一个关于dispatch_barrier和目标队列的问题.我有一个自定义串行队列和自定义并发队列,我将串行队列的目标队列设置为并发队列,然后该队列以全局并发队列为目标:
(serial queue) -> (concurrent queue) -> (global concurrent queue)
Run Code Online (Sandbox Code Playgroud)
当我dispatch_barrier在串行队列上阻塞时会发生什么?它是否会阻止提交到并发队列的块的执行,或仅阻止串行队列中的执行块?或者,如果我dispatch_barrier阻塞到非全局并发队列,它是否会阻止提交到串行队列的块的执行,还是只阻止非全局并发队列中块的执行?
感谢您的关注.:)
有一个用户想知道这意味着什么的帖子:
@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.h和block.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的人可以分享一些关于此的知识.
好的,我对这一个感到疯狂......
我正在使用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) 我试图延迟不到一秒钟.我从网上找到了这段代码.然而,它不接受不到一秒的延迟.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) 为什么下面的代码在主线程中运行,虽然我已经为后台线程指定了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/
请参阅"调度队列入门"部分.