我在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_once在语言版本3中进行更改后,Swift中的新语法是什么?旧版本如下.
var token: dispatch_once_t = 0
func test() {
dispatch_once(&token) {
}
}
Run Code Online (Sandbox Code Playgroud)
如何在Swift 3.0中实现方法调配?
我已经阅读了关于它的nshipster文章,但是在这个代码的块中
struct Static {
static var token: dispatch_once_t = 0
}
Run Code Online (Sandbox Code Playgroud)
编译器给我一个错误
dispatch_once_t在Swift中不可用:改为使用延迟初始化的全局变量
我dispatch_once_t在迁移到Swift 3 时遇到了麻烦.
根据Apple的迁移指南:
Swift中不再提供免费函数dispatch_once.在Swift中,您可以使用延迟初始化的全局变量或静态属性,并获得与提供的dispatch_once相同的线程安全性和一次性保证.例:
let myGlobal = { … global contains initialization in a call to a closure … }()
_ = myGlobal // using myGlobal will invoke the initialization code only the first time it is used.
所以我想迁移这段代码.所以它是在迁移之前:
class var sharedInstance: CarsConfigurator
{
struct Static {
static var instance: CarsConfigurator?
static var token: dispatch_once_t = 0
}
dispatch_once(&Static.token) {
Static.instance = CarsConfigurator()
}
return Static.instance!
}
Run Code Online (Sandbox Code Playgroud)
迁移后,遵循Apple的指导原则(手动迁移),代码如下所示:
class var sharedInstance: CarsConfigurator
{
struct Static …Run Code Online (Sandbox Code Playgroud) 我已经创建了一个计算的静态属性,我希望它计算一次,之后无论何时访问都只会返回原始计算值。lazy属性似乎是我想要的,但经过一些搜索后lazy,默认情况下似乎静态属性。
当我运行以下代码时,第一次访问它时/如果我单独运行每个单元测试,它会很好。但是,当我第二次访问它时,我得到了一个空数组。
static var att: [ConferenceNumber] = {
let list = buildDirectory(for: .att, from: jsonArray)
return list
}()
private static let jsonArray: [Any]? = {
let numbersFilePath = Bundle.main.path(forResource: "numbers", ofType:"json")
let data = try! Data(contentsOf: URL(fileURLWithPath:numbersFilePath!), options: .uncached)
return try! JSONSerialization.jsonObject(with: data) as? [Any]
}()
Run Code Online (Sandbox Code Playgroud)
第 2 次调用并返回空数组的代码
private static func isAttMeeting(meetingText: String, parsedPhoneNumbers: [String]) -> Bool {
let attPhoneNumbers = ConferenceNumberDirectory.att.map{$0.number}
let attNumberWasParsed = parsedPhoneNumbers.intersects(with: attPhoneNumbers)
if attNumberWasParsed {
return true
}
return meetingText.contains(pattern: …Run Code Online (Sandbox Code Playgroud) 已经试过这些:
'dispatch_once_t'在Swift中不可用:改为使用延迟初始化的全局变量
class var sharedInstance:Model{
struct Static{
static var instance:Model?
static var token: dispatch_once_t = 0
}
dispatch_once(&Static.token){
Static.instance = Model()
}
return Static.instance!
}
Run Code Online (Sandbox Code Playgroud)
请建议我dispatch_once_t的替代方法..我不知道swift,我代码C/C++/Obj.C,请给我快速代码修复上面的问题