Swift中使用Reactive获取网络数据,并字典转模型。

Swift微博模型与列表加载
本文介绍了使用Swift语言实现微博信息模型及列表加载的过程。包括Status模型定义,属性如创建时间、ID、文本内容和来源等,以及如何通过字典转换为模型对象。此外,还展示了StatusListViewModel类如何加载微博数据并将其转换为Status模型。

模型:

//
//  Status.swift
//  ceshi
//
//  Created by 胡双飞 on 15/10/11.
//  Copyright © 2015年 HSF. All rights reserved.
//

import UIKit
/// 微博模型
class Status: NSObject {

 
    //MARK:- 属性列表
    
    /// 微博创建时间
    var created_at: String?
 
    /// 微博ID
    var id: Int = 0
 
    /// 微博信息内容
    var text:String?

    /// 微博来源
    var source:String?
    
    //MARK:-字典转模型
    
    init(dic: [String: AnyObject]) {
        super.init()
        setValuesForKeysWithDictionary(dic)
    }
    
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
    //对象的描述信息
    override var description: String{
        
        let keys = ["created_at","id","text","source"]
        
        return dictionaryWithValuesForKeys(keys).description
    }
    
}




//
//  StatusListViewModel.swift
//  WeiBo
//
//  Created by 胡双飞 on 15/10/11.
//  Copyright © 2015年 HSF. All rights reserved.
//

import UIKit
import ReactiveCocoa

/// 微博列表模型 - 分离网络加载
class StatusListViewModel: NSObject {

    //微博数据数组
    var status:[AnyObject]?

    /// 加载微博数据
    func loadStatus()-> RACSignal{
        
        return RACSignal.createSignal({ (subscribe) -> RACDisposable! in
            
            NetworkTools.sharedTools.loadStatus().subscribeNext({ (result) -> Void in

                //1.获取网络数据,加载到字典数组中
                guard let array = result["statuses"] as? [[String: AnyObject]] else{
                    return
                }
                
                //2.字典转模型
                if self.status == nil{
                    //初始化Status模型的字典
                    self.status = [Status]()
                }
                
                //3.遍历模型
                for dic in array{
                    self.status?.append(Status(dic: dic))
                }

                subscribe.sendCompleted()

                }, error: { (error) -> Void in
                    
                    subscribe.sendError(error)
                    
                }) {}
            return nil
        })
        
    }
}


在 Vue 3 中,使用 `reactive` 声明一个响应式对象后,如果通过异步请求(例如使用 `fetch` 或 `axios`)获取数据对其进行赋值,需要注意保持响应式的特性不丢失。以下是一个典型的使用场景和实现方式: ```javascript import { reactive } from 'vue'; export default { setup() { const state = reactive({ data: null, loading: true, error: null }); // 异步获取数据更新响应式对象 fetch('https://api.example.com/data') .then(response => { if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }) .then(data => { state.data = data; // 更新响应式对象的属性 state.loading = false; }) .catch(error => { state.error = error; // 更新错误信息 state.loading = false; }); return { state }; } }; ``` 在上述代码中,通过 `reactive` 创建了一个包含 `data`、`loading` 和 `error` 属性的响应式对象 `state`。在异步请求成功后,将获取到的数据赋值给 `state.data`,在请求失败时更新 `state.error`。由于 `reactive` 会递归地将对象的所有嵌套属性换为响应式属性,因此直接赋值不会导致响应式丢失[^2]。 对于 React,通常使用 `useState` 钩子来管理状态。虽然 React 没有直接提供 `reactive` 这样的 API,但可以通过 `useState` 和 `useEffect` 钩子来实现类似的功能。以下是一个使用 `useState` 的示例: ```javascript import React, { useState, useEffect } from 'react'; function DataFetchingComponent() { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { // 异步获取数据更新状态 fetch('https://api.example.com/data') .then(response => { if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }) .then(data => { setData(data); // 更新数据状态 setLoading(false); }) .catch(error => { setError(error); // 更新错误状态 setLoading(false); }); }, []); // 空数组确保 effect 只在组件挂载时执行一次 if (loading) return <p>Loading...</p>; if (error) return <p>Error: {error.message}</p>; return ( <div> <h1>Data:</h1> <pre>{JSON.stringify(data, null, 2)}</pre> </div> ); } export default DataFetchingComponent; ``` 在 React 中,`useState` 提供了状态管理的能力,而 `useEffect` 用于处理副作用,如数据获取。在这个例子中,`fetch` 被用来从服务器获取数据数据到达后通过 `setData` 更新状态。这种方式确保了组件在数据加载完成后能够重新渲染[^1]。 ### 响应式对象的注意事项 在 Vue 3 中,使用 `reactive` 创建的响应式对象有一个重要的限制:不能将响应式对象的某个属性解构出来,否则该属性将失去响应性。例如: ```javascript const state = reactive({ count: 0 }); const { count } = state; // count 将不再是响应式 ``` 为了避免这种情况,可以使用 `toRefs` 或者直接访问对象的属性而不进行解构: ```javascript import { toRefs } from 'vue'; const state = reactive({ count: 0 }); const { count } = toRefs(state); // count 仍然是响应式 ``` 通过 `toRefs`,可以将响应式对象的所有属性换为 `ref` 对象,从而保持它们的响应性。 ### 总结 无论是 Vue 3 还是 React,在处理异步数据获取更新响应式状态时,都需要确保状态的响应性不丢失。Vue 3 提供了 `reactive` 和 `ref` 两种方式来管理响应式状态,而 React 则主要依赖 `useState` 钩子来管理状态。理解这些机制可以帮助开发者更好地构建高效、可维护的应用程序[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值