有没有办法在延迟后调用带有原始参数的块,比如使用performSelector:withObject:afterDelay:
但是使用像int
/ double
/ 这样的参数float
?
我从Apple那里浏览了iBook,找不到任何定义:
有人可以解释结构dispatch_after
吗?
dispatch_after(<#when: dispatch_time_t#>, <#queue: dispatch_queue_t?#>, <#block: dispatch_block_t?#>)
Run Code Online (Sandbox Code Playgroud) 我正在学习iOS的并发编程.到目前为止,我已经读过NSOperation
/NSOperationQueue
和GCD
.使用NSOperationQueue
over 的原因是什么GCD
,反之亦然?
听起来像是两者,GCD
并从用户那里NSOperationQueue
抽象出明确的创造NSThreads
.然而这两种方法之间的关系对我来说并不清楚,所以任何反馈都要赞赏!
concurrency nsoperation nsoperationqueue grand-central-dispatch ios
在Swift 2中,我能够dispatch_after
使用大中央调度来延迟一个动作:
var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
// your function here
})
Run Code Online (Sandbox Code Playgroud)
但这似乎不再在Swift 3(或4)中编译.在Swift 3中使用新的Dispatch API编写它的首选方法是什么?
在Swift 2中,我能够使用以下代码创建队列:
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
Run Code Online (Sandbox Code Playgroud)
但这不能在Swift 3中编译.
在Swift 3中写这个的首选方法是什么?
如果您可以定位iOS 4.0或更高版本
使用GCD,它是在Objective C(线程安全)中创建单例的最佳方法吗?
+ (instancetype)sharedInstance
{
static dispatch_once_t once;
static id sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
Run Code Online (Sandbox Code Playgroud) 我在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 work here
});
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我有一个函数,它生成NSRURLSession并使用发送NSURLRequest
sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error)
Run Code Online (Sandbox Code Playgroud)
在这个任务的完成块中,我需要做一些计算,将UIImage添加到调用viewcontroller.我有一个叫做的功能
func displayQRCode(receiveAddr, withAmountInBTC:amountBTC)
Run Code Online (Sandbox Code Playgroud)
这是UIImage添加计算.如果我尝试在完成块内运行视图添加代码,Xcode会抛出一个错误,说我在后台进程中无法使用布局引擎.所以我在SO上发现了一些试图在主线程上排队方法的代码:
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.0 * Double(NSEC_PER_MSEC)))
dispatch_after(time, dispatch_get_main_queue(), {
let returned = UIApplication.sharedApplication().sendAction("displayQRCode:", to: self.delegate, from: self, forEvent: nil)
})
Run Code Online (Sandbox Code Playgroud)
但是,我不知道如何将参数"receiveAddr"和"amountBTC"添加到此函数调用中.我该怎么做,或者有人可以建议一种方法调用添加到应用程序主队列的最佳方法吗?
使用GCD时,我们希望等到两个异步块执行完成后再继续执行下一步.最好的方法是什么?
我们尝试了以下方法,但它似乎不起作用:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
// block1
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
// block2
});
// wait until both the block1 and block2 are done before start block3
// how to do that?
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^ {
// block3
});
Run Code Online (Sandbox Code Playgroud) ios ×7
objective-c ×4
swift ×4
swift3 ×2
concurrency ×1
libdispatch ×1
nsoperation ×1
parameters ×1
singleton ×1
swift4 ×1
swift5 ×1
xcode8 ×1