Swift开发问题:Text组件无法显示变量valueWeWantToGrab的实际取值
问题根因
- 变量作用域错误:网络请求闭包内重新声明了局部变量
valueWeWantToGrab,赋值操作未作用到@State修饰的全局属性,Text绑定的属性值始终为空。 - 线程不匹配:URLSession回调默认运行在后台线程,SwiftUI要求UI状态更新必须在主线程执行,后台修改
@State属性不会触发视图刷新。 - 请求未启动:创建
dataTask实例后未调用resume()方法,请求不会主动执行。 - 请求位置错误:
body是视图渲染计算属性,每次刷新都会重新执行,写在body中的网络请求会被反复触发,需放到onAppear生命周期方法中执行。 - 协议错误:Instagram已强制使用HTTPS,你填写的HTTP开头的地址会被苹果ATS安全策略拦截。
修复代码
struct ContentView: View { @State var valueWeWantToGrab = "" var body: some View { Text(valueWeWantToGrab) .onAppear(perform: fetchFollowerCount) } private func fetchFollowerCount() { let baseUrl = "https://www.instagram.com/" let username = "替换为目标账号名" guard let url = URL(string: baseUrl + username) else { print("非法URL") return } let task = URLSession.shared.dataTask(with: url) { data, _, error in guard let data = data, error == nil else { print("请求失败:\(error?.localizedDescription ?? "未知错误")") return } guard let htmlString = String(data: data, encoding: .utf8) else { print("数据转字符串失败") return } let leftSideString = "edge_followed_by\":{\"count\":" let rightSideString = "},\"followed_by_viewer" guard let leftRange = htmlString.range(of: leftSideString), let rightRange = htmlString.range(of: rightSideString) else { print("未匹配到粉丝数字段,可能是反爬验证页面") return } let followerCount = htmlString[leftRange.upperBound..<rightRange.lowerBound] print(followerCount) DispatchQueue.main.async { self.valueWeWantToGrab = String(followerCount) } } task.resume() } }
补充说明
Instagram网页端存在反爬机制,未登录状态下请求大概率会返回人机验证页面,正则匹配的方式稳定性极低,建议使用官方开放接口获取数据。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

