Learn how to store data locally and make network requests.
The UserDefaults
class provides a way to store simple data persistently.
@State private var username = UserDefaults.standard.string(forKey: "username") ?? ""
var body: some View {
TextField("Username", text: $username)
.onDisappear {
UserDefaults.standard.set(username, forKey: "username")
}
}
Explanation:
@State private var username = UserDefaults.standard.string(forKey: "username") ?? ""
: Declares a state variable to hold the username, retrieving it from UserDefaults if it exists.TextField("Username", text: $username)
: Creates a text field for entering the username..onDisappear { UserDefaults.standard.set(username, forKey: "username") }
: Saves the username to UserDefaults when the view disappears.CoreData is Apple's framework for managing object graphs and persisting data.
// Assume CoreData setup is done in the AppDelegate or SceneDelegate
@Environment(\.managedObjectContext) private var viewContext
var body: some View {
// Example of fetching and displaying CoreData entities
Text("CoreData Example")
}
Explanation:
@Environment(\.managedObjectContext) private var viewContext
: Declares an environment variable to access the CoreData managed object context.Text("CoreData Example")
: Placeholder for displaying CoreData entities.Using URLSession
to perform network requests.
@State private var data: String = ""
var body: some View {
VStack {
Text(data)
Button("Fetch Data") {
fetchData()
}
}
}
func fetchData() {
guard let url = URL(string: "https://api.example.com/data") else { return }
URLSession.shared.dataTask(with: url) { data, response, error in
if let data = data, let fetchedData = String(data: data, encoding: .utf8) {
DispatchQueue.main.async {
self.data = fetchedData
}
}
}.resume()
}
Explanation:
@State private var data: String = ""
: Declares a state variable to hold the fetched data.Text(data)
: Displays the fetched data.Button("Fetch Data") { fetchData() }
: Fetches the data when the button is tapped.func fetchData()
: Defines the function to fetch data from the network.guard let url = URL(string: "https://api.example.com/data") else { return }
: Creates a URL from the string and ensures it is valid.URLSession.shared.dataTask(with: url) { data, response, error in ... }.resume()
: Creates a data task to fetch the data and resumes it.if let data = data, let fetchedData = String(data: data, encoding: .utf8) { DispatchQueue.main.async { self.data = fetchedData } }
: Converts the data to a string and updates the state variable on the main thread.Parsing JSON data into Swift models.
struct User: Codable {
let id: Int
let name: String
}
@State private var users: [User] = []
var body: some View {
List(users) { user in
Text(user.name)
}
.onAppear {
fetchUsers()
}
}
func fetchUsers() {
guard let url = URL(string: "https://api.example.com/users") else { return }
URLSession.shared.dataTask(with: url) { data, response, error in
if let data = data {
let decoder = JSONDecoder()
if let fetchedUsers = try? decoder.decode([User].self, from: data) {
DispatchQueue.main.async {
self.users = fetchedUsers
}
}
}
}.resume()
}
Explanation:
struct User: Codable
: Defines a model that conforms to the Codable
protocol for JSON decoding.@State private var users: [User] = []
: Declares a state variable to hold the list of users.List(users) { user in Text(user.name) }
: Creates a list view with dynamic rows. Each row displays the user's name..onAppear { fetchUsers() }
: Fetches the users when the view appears.func fetchUsers()
: Defines the function to fetch users from the network.guard let url = URL(string: "https://api.example.com/users") else { return }
: Creates a URL from the string and ensures it is valid.URLSession.shared.dataTask(with: url) { data, response, error in ... }.resume()
: Creates a data task to fetch the data and resumes it.if let data = data { let decoder = JSONDecoder(); if let fetchedUsers = try? decoder.decode([User].self, from: data) { DispatchQueue.main.async { self.users = fetchedUsers } } }
: Decodes the JSON data into an array of User
objects and updates the state variable on the main thread.Implementing strategies for data synchronization.
// Placeholder for detailed synchronization logic and implementation
Text("Synchronization Example")
Explanation:
// Placeholder for detailed synchronization logic and implementation
: Placeholder for implementing data synchronization logic between online and offline states.Text("Synchronization Example")
: Placeholder for displaying synchronized data.