Swift中实例变量mystring赋值后未保留值,mystring2正常的问题求助
问题分析与解决方案
嘿,这个问题其实是异步网络请求的典型“时间差”坑!我来给你拆解清楚:
核心原因:Alamofire请求是异步执行的
Alamofire的网络请求不会阻塞主线程——当你发起请求后,系统会把请求放到后台队列处理,主线程会继续执行后续代码。你的代码执行流程大概是这样的:
- 初始化
Answers类,声明mystring和mystring2(初始都是nil) - 发起Alamofire请求,此时请求还在后台加载数据,主线程直接往下走了
- 你调用
someFunc(),这时候请求还没完成,mystring还没被赋值(还是nil),但mystring2是你在同步代码里直接赋值的,所以能拿到"test" - 等请求完成后,
mystring才被赋值为"ABC",但这时候someFunc()早就执行完了,所以你看不到这个值
解决方案
方案1:在请求完成闭包内调用使用变量的函数
确保mystring赋值完成后,再执行需要用到它的代码:
// Alamofire请求完成闭包内 let jsonData = result as! NSDictionary if !(jsonData.value(forKey: "error") as! Bool) { let user = jsonData.value(forKey: "awdata") as! NSDictionary let question = user.value(forKey: "question") as! String print(question) // 返回字符串 "ABC" mystring = question mystring2 = "test" // 赋值完成后再调用函数,此时mystring已经有值了 someFunc() }
方案2:用回调/通知机制处理异步结果
如果someFunc()不能直接在闭包里调用,可以用闭包回调、代理模式或者Combine(Swift 5+)来通知请求完成,再处理变量。比如闭包回调的例子:
// 定义回调闭包类型 typealias RequestCompletion = (String?, String?) -> Void func fetchData(completion: @escaping RequestCompletion) { // Alamofire请求代码 Alamofire.request("your_request_url").responseJSON { response in guard let result = response.result.value as? NSDictionary, let isError = result.value(forKey: "error") as? Bool, !isError, let user = result.value(forKey: "awdata") as? NSDictionary, let question = user.value(forKey: "question") as? String else { completion(nil, nil) return } let testStr = "test" completion(question, testStr) } } // 调用时 fetchData { [weak self] question, testStr in guard let self = self else { return } self.mystring = question self.mystring2 = testStr self.someFunc() // 此时变量都已赋值 }
额外建议:避免强制解包,用可选绑定更安全
你代码里的!强制解包很容易引发崩溃,换成可选绑定能大幅提升代码稳定性:
guard let jsonData = result as? NSDictionary, let isError = jsonData.value(forKey: "error") as? Bool, !isError, let user = jsonData.value(forKey: "awdata") as? NSDictionary, let question = user.value(forKey: "question") as? String else { // 处理解析失败的情况,比如弹窗提示用户 return } print(question) mystring = question mystring2 = "test" someFunc()
内容的提问来源于stack exchange,提问作者Scripy
相关产品推荐
相关产品推荐

