Daniel Saidi's Blog
Sheeeeeeeeet 1.2 introduces a completely rewritten appearance engine that makes it easier than ever to style and subclass your action sheets and their items. In this post, I’ll discuss some of the major changes.
In this post, I’ll write about my long process to find a setup that lets me be more productive and flexible in how I work with my various sites, projects, blog etc. I will descibe how I moved away from my old hosting provider and Wordpress and how I finally found a setup that lets me create content on my iPad Pro.
This is an updated version of talk I gave at CocoaHeads Sthlm in April 2017. The
talk was on how to use Alamofire to talk to an api, AlamofireObjectMapper to map
its responses, use the Alamofire
RequestRetrier to automatically retry failing
requests and use
RequestAdapter to adapt all requests. I also demonstrated how
to use Realm to seamlessly add offline support, using the decorator pattern.
In this post, I will show how to reduce the amount of code you have to type when
testing enums, by using the new
In this blog post, I will show how to automate setting up Xcode for you and your
team, including setting up required tools, simplify enforcing common conventions
Fastlane in a way that is easy to extend if you need
to automate more tasks later on.
After installing Xcode 10 yesterday, I started migrating some libraries to Swift
4.2. While most migrations were painless, one caused me some headache, since the
library depends on
SwiftyDropbox which does not yet support Swift 4.2.
In this post, I’ll describe how you can automate setting up a brand new Mac with
a terminal script that will install system software, applications, configure the
computer etc. This will help you setup a new Mac in minutes.
After putting years into iOS and Swift development, I have come to a point where
I am pretty happy with my project structure, code conventions, coding habits etc.
This year, I decided not to wait a while year before installing the latest macOS,
so I grabbed it as a beta, installed it and didn’t look back. Before doing so, I
also created a setup script that quickly can setup a clean computer from scratch.
I am not that brave.
It’s been a long time coming, but I have eventually gotten around to replace all
NSCoding objects in my Swift libraries with
Codable. This post covers things
that I’ve learned along the way.
In an app of mine, I had an idea on how to redesign how we extend protocol-based
domain models. However, what first looked like a walk in the park, turned into a
Swift nightmare, with problems that I am still struggling with.
In my previous post, I wrote about how I do
not like iOS delegates and target/selectors and how I prefer to use closures.
After hearing so many good things about
RxSwift and not having the opportunity
to try it at work, I decided to use it when I rewrote an old app of mine.
Tonight, I finally sat down with my oldest daughter Cornelia, to play with Swift
Playgrounds and try to teach her a bit about programming.
In this post, I will write about my experience using Working Copy on my iPad Pro,
adding a blog post to a Jekyll-powered blog, then pushing the result to GitHub.
This post will show you how to apply the
UITextField placeholder behavior to a
UITextView, which natively lacks this support.
This is a summary of my talk at CocoaHeads Sthlm, April 3 2017,
where I talked about using Alamofire, AlamofireObjectMapper and Realm to talk to
an api, map its responses, automatically retry and adapt requests and how to use
Realm to create implicit offline support.
I am really looking forward to a HoloLens event at tretton17
next week, where Jimmy Engström will demonstrate this awesome piece of technology:
When creating CocoaPods, I use Quick for tests
and Nimble for assertions. They are great and
really speed up writing tests.
After procrastinating for too long, I finally spent a minute of my life to setup
git autocomplete in the macOS terminal. The original discussion on this topic is
I finally made it! After years and years of “I really shouldn’t”, I have finally
managed to abandon my old hosting provider and move all my sites to GitHub.
In a project that I’m currently working on, I load images asynchronously into an
UIImageView. As the download starts, I apply a placeholder image from the bundle
to the image view, to indicate that no image has yet been downloaded.
Today, I managed to click the “Skip Bundles” button instead of the “Load Bundles”
button, when I started up Xcode after adding two new plugins.
I have been playing around with .NET Core since the early betas, but since I do
so with rather long times in between, things break each time I decide to pick up
from where I started.
In an Ionic 2 app that I am building for iOS and Android, I want to use different
application settings for different build configurations. For instance, I want to
use different api endpoints for development and production apps, disable tracking
for development apps, disable logging for production apps etc.
With the release of Visual Studio Code 1.0,
I decided to upgrade .NET Core to the latest version. However, the older version
was not properly replaced when upgrading, which did cause Visual Studio Code and
Omnisharp to behave quite strange.
I am currently developing a console app in .NET Core on my Mac. It’s a rather nice
experience, although I miss a lot of stuff from Visual Studio - expecially R#.
After so much waiting, so many “I’ll do this first”, so much app coding etc. etc.
(yep, I blame my family as well), I finally managed to start playing around with
DNX and ASP.NET 5.
In an app that I am building, I have a map where users can save personal content
and present it in a beauuutiful way. Ok, enough with the sales pitch.
After some time away from .NET, ASP.NET and WebApi, I’m having a great time when
setting up a new WebApi solution for a project at work.
I am currently building my very first app with Ionic Framework. So far, Ionic is
super fast to setup and performs really well, so I hope performance doesn’t drop
once we begin to add images and content to the app.
After upgrading to Xcode 6.3.1, I got a new error that I haven’t received before: