NSURLConnection делегирование с отдельным потоком
Я использую MBProgressHUD в качестве индикатора. И вы знаете, что он использует отдельный поток при выполнении какого-либо другого метода. Когда я хочу использовать NSURLConnection
его делегация не звонит должным образом.
Вот что у меня есть (файл @implementation):
- (void)viewDidLoad {
[super viewDidLoad];
[self hudShowWithLabel];
}
-(void)hudShowWithLabel {
HUD = [[MBProgressHUD alloc] initWithView: self.view];
[self.view addSubview:HUD];
HUD.delegate = self;
HUD.labelText = @"Loading";
[HUD showWhileExecuting:@selector(myTask) onTarget:self withObject:nil animated:YES];
}
-(void)myTask {
responseData = [NSMutableData data];
NSLog(@"Is%@ main thread", ([NSThread isMainThread] ? @"" : @" NOT"));
NSString *requestURL = @"http://someurl";
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:requestURL]];
(void)[[NSURLConnection alloc] initWithRequest:request delegate: self];
}
Во время бега я вижу, что myTask
не в MainThread
, Как я мог решить эту проблему?
2 ответа
Вы можете запустить NSURLConnection в основной теме:
[self performSelectorOnMainThread:@selector(start) withObject:nil waitUntilDone:YES];
И запуск селектора:
- (void)start
{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:requestURL]];
self.connection =[[NSURLConnection alloc] initWithRequest:request
delegate:self
startImmediately:NO];
[self.connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[self.connection start];
}
Есть также пример на github.
NSURLConnection запускается в другом потоке, который должен иметь цикл выполнения. Вы можете попробовать добавить код для цикла выполнения следующим образом в метод main вашего потока:
while (!finished)
{
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}