GestureRecognizer??
multipart/form-data. Он на самом деле нифига не простой. А Curl штука достаточно низкоуровневая. Она не умеет из коробки слать такие запросы. Либо используйте что-то типа Guzzle, либо отправляйте всё руками то, что требует multipart/form-data.
multipart/form-data. У вас нет ни заголовка, ни boundary. И заголовок application/json, а не multipart/form-data.И вправду, почему это может быть...
Thread & Pthread лучше не трогать ) Они для крайне специфичной работы.
DispatchQueue.main. Тут всё предельно ясно, на такую очередь кидают задания асинхронно, что бы не тормозить и не загружать лишней задачей DispatchQueue.main. DispatchQueue.main для того, что бы асинхронно добавить задачу в главный поток, составляют обычно задачи, кототрые напрямую используют UI, но при этом они достаточно долгие и могут притормозить ваш главный поток. pushViewController отрабатывает достаточно быстро и результат её работы нужен тут же. Это всё равно, что пытаться открыть дверь и не дожидаясь её открытия Вы прёте в закрытую дверь. NSOperation ещё более фундаментальная штука. Такие вещи нужно хорошо понимать, если вы хотите стать хорошим разработчиком.
DispatchQueue.main.async заставляет текущий поток не дожидаться работы функции pushViewController. То есть вам нужно здесь и сейчас перейти на другой VC, а вы просто берете и добавляете к переходу ещё пару микросекунд/миллисекунд времени. Зачем стрелять себе в ногу я не понимаю.