Swift 2 с ошибкой Ручка и пользовательский заголовок запроса
Просто добавьте расширение в UIImageView:
extension UIImageView {
public func imageFromUrl(urlString: String) {
if let url = NSURL(string: urlString) {
let request = NSMutableURLRequest(URL: url)
request.setValue("<YOUR_HEADER_VALUE>", forHTTPHeaderField: "<YOUR_HEADER_KEY>")
NSURLSession.sharedSession().dataTaskWithRequest(request) {
(data, response, error) in
guard let data = data where error == nil else{
NSLog("Image download error: \(error)")
return
}
if let httpResponse = response as? NSHTTPURLResponse{
if httpResponse.statusCode > 400 {
let errorMsg = NSString(data: data, encoding: NSUTF8StringEncoding)
NSLog("Image download error, statusCode: \(httpResponse.statusCode), error: \(errorMsg!)")
return
}
}
dispatch_async(dispatch_get_main_queue(), {
NSLog("Image download success")
self.image = UIImage(data: data)
})
}.resume()
}
}
}
И затем используйте новый imageFromUrl(urlString: String)
для загрузки изображения
Использование:
imageView.imageFromUrl("https://i.imgur.com/ONaprQV.png")
В.NET ThreadPool
потоки не возвратятся, не настраивая ManualResetEvent
с или AutoResetEvent
с. Я нахожу их излишеством для быстрого метода тестирования (не говоря уже о довольно сложном, чтобы создать, установить, и справиться). Рабочий Background также немного сложен с обратными вызовами и таким.
Что-то я нашел, что работы
ThreadStart
метод каждого потока. public static void MultiThreadedTest()
{
Thread[] threads = new Thread[count];
for (int i = 0; i < threads.Length; i++)
{
threads[i] = new Thread(DoSomeWork());
}
foreach(Thread thread in threads)
{
thread.Start();
}
foreach(Thread thread in threads)
{
thread.Join();
}
}
@ajmastrean, так как результат модульного теста должен быть предсказуемым, мы должны синхронизировать потоки так или иначе. Я не вижу простой способ сделать это, не используя события.
я нашел тот ThreadPool. QueueUserWorkItem дает мне простой способ протестировать такие варианты использования
ThreadPool.QueueUserWorkItem(x => {
File.Open(fileName, FileMode.Open);
event1.Set(); // Start 2nd tread;
event2.WaitOne(); // Blocking the file;
});
ThreadPool.QueueUserWorkItem(x => {
try
{
event1.WaitOne(); // Waiting until 1st thread open file
File.Delete(fileName); // Simulating conflict
}
catch (IOException e)
{
Debug.Write("File access denied");
}
});
Ваша идея должна хорошо работать. В основном Вы просто хотите породить набор потоков и удостовериться те пишущие, что файл занимает много времени достаточно, чтобы сделать это, чтобы на самом деле заставить читателей ожидать. Если весь Ваш возврат потоков без ошибки, и не блокируясь навсегда, то тест успешно выполняется.