В первую очередь пишу код для iphone. Мне нужно иметь возможность вызывать метод в основном потоке без использования performSelectorOnMainThread
. Причина, по которой я не хочу использовать, performSelectorOnMainThread
заключается в том, что это вызывает проблемы, когда я пытаюсь создать макет для модульного тестирования.
[self performSelectorOnMainThread:@Selector(doSomething) withObject:nil];
Проблема в том, что мой макет умеет звонить, doSomething
но не умеет звонить performSelectorOnMainThread
.
Итак, любое решение?
ios
objective-c
iphone
multithreading
methods
арьякст
источник
источник
В программном обеспечении есть поговорка, что добавление уровня косвенного обращения исправит почти все.
Пусть метод doSomething будет косвенной оболочкой, которая выполняет только функцию performSelectorOnMainThread для вызова метода really_doSomething для выполнения фактической работы Something. Или, если вы не хотите изменять свой метод doSomething, пусть тестовый модуль вызывает метод doSomething_redirect_shell, чтобы сделать что-то подобное.
источник
Вот лучший способ сделать это в Swift:
runThisInMainThread { () -> Void in // Run your code self.doSomething() } func runThisInMainThread(block: dispatch_block_t) { dispatch_async(dispatch_get_main_queue(), block) }
Он включен в качестве стандартной функции в мое репо, проверьте это: https://github.com/goktugyil/EZSwiftExtensions
источник
dispatch_async
заблокированном коде после звонка на него? Весь смысл использования,async
а не вsync
том, чтобы НЕ блокировать то, что следует. (Конечно,block
код БУДЕТ блокировать что-либо еще в основном потоке , так как цель запрошенного кода - выполнение в основном потоке. Если вы хотите запустить фоновый код, вы бы запросили другую очередь, нетdispatch_get_main_queue
.)А теперь в Swift 3:
DispatchQueue.main.async{ self.doSomething() }
источник
// Draw Line func drawPath(from polyStr: String){ DispatchQueue.main.async { let path = GMSPath(fromEncodedPath: polyStr) let polyline = GMSPolyline(path: path) polyline.strokeWidth = 3.0 polyline.strokeColor = #colorLiteral(red: 0.05098039216, green: 0.5764705882, blue: 0.2784313725, alpha: 1) polyline.map = self.mapVu // Google MapView } }
источник