This article is an alternative on how to write the content of
String
to a file in Swift. If you haven’t yet read that post, you may want to read it, as it gives you the same idea of how to write to a file.Writing data to a file has many use cases, such as if you are saving sessions or trying to cache the data for future use. There are some cases when you have large amounts of data, but you just show a window of it, so you don’t need all of it to bloat your memory. Although memory has paging, you may need to write that data to ensure availability or for your own use case.
Regardless of the use case, Swift already provides APIs for writing data to a file on disk. This is how.
With Network Spy you can monitor, inspect, and modify your network traffic during development. Perfect for debugging and more analysis. 🙌
Join the Waitlist Today! https://mozzlog.com/projects/network-spy
Prerequisite
Just like the String tutorial counterpart, you need nothing to be installed because the API is already provided by the
Foundation
module. All you need to do is import that module, and you are good to go to use the API.Swift team, you are awesome!
Write to a File using Swift
To write to a file in Swift, you can use the
write
method in Data
. The write
method can be used to write content to a file synchronously. Here's an example:import Foundation print("Start Write") let content = "My name is Mozzlog".data(using: .utf8)! let url = URL(filePath: "file.txt") do { try content.write(to: url) print("End Write") } catch { print("Error: \\(error)") }
Just like in
String.write
, when you use Data.write
you will overwrite the existing file if it exists or create a new one if it does not.The code above is almost identical to how you write a content of
String
to a file in Swift. You use a similar write
method to write it. But there are some differences with String.write
method as follows:- The
Data.write
method requires you to pass aURL
instance instead ofString
instance
- The
Data.write
API does not pass String filepath
Write to a File using Swift Asynchronously
Well, like in the String write to file tutorial, you will use
DispatchQueue
because the write API is only available as a synchronous API. Foundation
doesn’t provide you with an asynchronous write API.It is easy to implement
import Foundation func writeFileAsync() { print("Start Write") let content = "My name is Mozzlog" let fileURL = URL(fileURLWithPath: "file.txt") DispatchQueue.global(qos: .background).async { do { try content.write(to: fileURL, atomically: true, encoding: .utf8) DispatchQueue.main.async { print("Finish Write") print("Continue Working") } } catch { print("Error: \\(error)") } } }
The above code will produce output in the log like this:
Start Write Finish Write Continue Working
Actually, you don’t need to write in
DispatchQueue.global(qos:.background)
because as long as you call the async
method from a dispatch queue, then it will be executed in a concurrent manner.Writing the file as a background task allows you to block the current thread so the program can do a much more meaningful task. Your program doesn’t need to wait for the writing logic to finish before continuing with the next task.
Dispatching the write operation in the background queue and calling the callback ensures your file writing is done asynchronously.
Conclusion
Using the
Foundation
framework's file system capabilities, it is straightforward to write synchronously or asynchronously to a file in Swift. This enables you to efficiently manage file operations and maintain a seamless user experience in your applications.Swift already provides the API necessary for synchronous and asynchronous writing. Every API has unique advantages and considerations. Asynchronous programming allows you to optimize the performance of your program, whereas synchronous programming allows you to design your code from the top down.
Happy Writing Your File!