Category Archives: iOS

ReactiveCocoa – how to test asynchronous signal

I have signal like this:

It makes some job in background thread and then returns an array of ViewModels to display a list of time zones.

You can use RACSignal (Testing) category in RACSignal.h to test such signals.

My tests are following:

Почему нужно писать юнит-тесты, пример

Юнит тесты реально спасают, я вот написал тест:

и он не прошел. Оказалось, что я забыл проставить boolValue тут:

Что интересно, без boolValue никаких warnings и тем более ошибок сборки.

iOS Unit Test Examples / Snippets

In this article I will post common iOS Unit testing examples for testing of:

  1. Asynchronous loading of data using REST API
  2. Loading of a UIView
  3. Method call after UITableViewCell is clicked
  4. Static UITableView sections have correct number of rows
  5. Loading of a UIView from UIStoryboard
  6. IBOutlet connection
  7. Model logic
  8. UITableViewCell subclass
  9. IBAction / Method is implemented
  10. Testing bundle name

Asynchronous loading of data using REST API

Here [RSHTTPClient sharedClient] is an instance of AFHTTPSessionManager subclass. But it doesn’t matter, the main is the principle.

Loading of a UIView

Method call after UITableViewCell is clicked

Here we verify that method restoreHomeKitClicked is called when user selects a specific row in UITableView.

Static UITableView sections have correct number of rows

Loading of a UIView from UIStoryboard

IBOutlet connection

Model logic

Here we test that an array, that is formed inside our model has correct number of items. Model logic testing obviously can be different depending of logic itself.

UITableViewCell subclass

IBAction / Method is implemented

Testing bundle name

The last is a rare case, but helps to prevent someone changing a bundle name of project accidentally.

How to wait until several AFNetworking requests finish

Use dispatch_group_t, dispatch_group_enter dispatch_group_leave, dispatch_group_notify.

Also, below is code to send a huge array to server by dividing ti to parts. It is actual when a single request is too big for server – you get “URL too long error” or HTTP 414.

How to create semi-transparent outside border for UIImageView

Just in case if somebody looks for an UIImage with transparent outside border. If you simply set a layer border, you will get a transparent border, but you will see inside image behind that border, not outside image. I managed to create an ImageView with transparent outside border.

It looks like this:
cool image

The idea is simple. I save UIImage from UIImageView. Then I remove UIImage and set initial layer as border layer. Then I put a new smaller sublayer above it and set a saved UIImage as contents of it.

The same approach can be used for UIButton or UIView.

Что нового в iOS 9

Новинки в iOS 9:

1. Новое встроенное приложение News, улучшения Notes, Maps, Wallet, CarPlay.

2. На iPad появится Split View, можно будет пользоваться несколькими приложениями одновременно, например, Safari и Twitter.

3. Siri станет умнее. Например, можно будет попросить Siri напомнить о чем-то, когда ты будешь дома. Она сама создает уведомление с привязкой к локализации.

4. Улучшения производительности. Батарея на 1 час дольше будет держаться. Встроенные приложения начнут использовать Metal, то есть по сути графический процессор. Для обновления системы достаточно будет не 4, а 1 гб свободной памяти.

#iOS9, #Apple

How to clean all targets in XCode 6 including Pods

When you clean a project, you actually clean only main target. If you want to clean all targets, for example, Pods after installing new versions of pods, you should use another option.

To clean all targets in XCode 6 including Pods use Shift+Cmd+Alt+K button. It calls “Clean Build Folder…” command, which is not visible from menus.

Probably, I don’t know something, because this way of cleaning seems to be not so obvious.

My visit to a YaC 2014 Conference (Mobile section)

YaC 2014 – Yet Another Conference was organized by Yandex in Moscow in October 2014. It is a largest developer conference in Russia. I have participated only in a Mobile section.

There was a presentation from Orta Therox – the creator of CocoaPods, called “Tools, Testing and new New Team Members. The Story of Post 1.0”. Here is his presentation.

A presentation from Ashley Nelson-Hornstein from Dropbox called “Building Quality Code That Lasts: A Dropbox Story”

and some other presentations from Russian developers.

All materials are published now and available for free.

What I did get from all that is something new about unit and integration testing – using mocks to speed up network connection related tests, information about some new instruments and team development, something new about View stacks and some understanding of possibilities of using JavaScript in a new iOS WebView – WKWebView. Found a new friend – another mobile developer.

Here are some of my own photos:

How to safely work with NSDictionary that may have empty values or may not have a key


NSDictionary sometimes can contain a key with empty values or even may not contain a key, that we expect to have. This is a very common problem, when you work with server APIs and parse network JSON responses to a NSDictionary. In this post I will describe how to safely work with NSDictionary that may have empty values or may not have a key.

The method objectForKey will return nil, if there is no a key, a key doesn’t exist in a dictionary.

You can’t add nil to a NSDictionary. NSDictionary will throw an NSInvalidArgumentException if you attempt to insert a nil value. You would have to use [NSNull null] instead. NSNull is something called nothing, while nil is simply nothing.

Checks that value for key is not empty.

But if a dic doesn’t contain a key, you will enter to the body of a condition dic[@”key”] != (id)[NSNull null].

For example, before taking integerValue from obj, you must be sure, that it is not [NSNull null]:

Checks that the key exists, but value for it can still be empty.

So the optimal check while reading NSDictionary is this, where key is “key”

You can’t add nil to a NSDictionary. So you have to check, that your object is not nil before adding:

But you can add [NSNull null]:

Version of code, where you check if dictionary entry exists and not empty:

I have created a NSDictionary category that has a method to check if a key exists and value is not empty:

This is an example, how to use it:

iOS : Creating Random E-mail and Phone Number


This is a sample code how to create random e-mail and phone number. I used it in my unit tests of authorization.