Загрузите задний план с помощью цикла do while
Я работаю над приложением, где я проверяю URL, используя следующий код.
-(недействительными) существует { NSString *strImg = @"некоторый URL"; NSURL *aImgUrl = [NSURL URLWithString:strImg]; NSMutableURLRequest *imgRequest = [NSMutableURLRequest requestWithURL:strImg]; [imgRequest setHTTPMethod:@"HEAD"]; imgConnection = [NSURLConnection connectionWithRequest: делегат imgRequest:self]; }
Это то, что я делаю, когда получаю ответ.
-(недействительное) соединение:(NSURLConnection *) соединение didReceiveResponse:(NSURLResponse *) ответ { if ([(NSHTTPURLResponse *) ответ statusCode] == 200) { // URL существует appDel.isExists = TRUE; temp = FALSE; [self loadData]; NSLog(@"%ld",(long)[(NSHTTPURLResponse *) ответ statusCode]); } иначе if ([(NSHTTPURLResponse *) ответ statusCode] == 404) { // URL не существует appDel.isExists = FALSE; temp = TRUE; [self loadData]; NSLog(@"%ld",(long)[(NSHTTPURLResponse *) ответ statusCode]); } }
Это мой код данных загрузки
-(недействительными) LoadData { результат = ЛОЖЬ; isReqSent = FALSE; делать { if (appDel.isExists == TRUE) { NSURL *aTxtUrl = [NSURL URLWithString:apiText]; NSURL *aImgUrl = [NSURL URLWithString:apiImage]; NSURLRequest *imgRequest = [NSURLRequest requestWithURL:aImgUrl]; NSURLRequest *txtRequest = [NSURLRequest requestWithURL:aTxtUrl]; [NSURLConnection sendAsynchronousRequest: очередь txtRequest:[NSOperationQueue mainQueue] завершение Handler:^(ответ NSURLResponse *, данные NSData *, NSError *connectionError) { если (данные) { NSString *strTxt = [[NSString alloc]initWithData: кодировка данных:NSUTF8StringEncoding]; [lblTime setText:strTxt]; [policyImgWebView loadRequest:imgRequest]; результат = ИСТИНА; } }]; } если (результат) { appDel.isExists = TRUE; } еще { если (!isReqSent) { NSString *soapMessage = @"мое мыльное сообщение"; NSString *soapAction = @"мой мыльный URL"; [objWebServiceParser xmlParsing:soapMessage:soapAction:Number]; isReqSent = TRUE; } } если (темп) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ [self backgroundProcess]; }); } } while (result == FALSE);
Это мой фоновый процесс
-(недействительными)backgroundProcess { NSString *strImg = @"некоторый URL"; NSURL *aImgUrl = [NSURL URLWithString:apiImage]; NSMutableURLRequest *imgRequest = [NSMutableURLRequest requestWithURL:aImgUrl]; [imgRequest setHTTPMethod:@"HEAD"]; imgConnection = [NSURLConnection connectionWithRequest: делегат imgRequest: self]; }
я не знаю, где я делаю что-то не так, может ли кто-нибудь направить меня?
я хочу, чтобы фоновый процесс продолжался до тех пор, пока он не получит данные, когда полученные данные appdel.isExists сбудутся и попадут в основной поток для обновления пользовательского интерфейса.
Я попробовал GCD & performSelectorInTheBackground
но я не правильно понимаю, и я понимаю NSThread
ошибка ошибки 35.
Он работал с NSURLSessionDownloadTask, но все еще ищет лучший вариант.
2 ответа
Чтобы загрузить изображение в ваш UIImageView
с сервера, вы можете использовать ниже рамки.
Ты получаешь completionBlock
, progressBlock
и многие другие свойства, которые вы можете использовать для обновления вашего интерфейса. Он будет уведомлять вас в блоках, а затем вы можете обновить все, что вы хотите на пользовательском интерфейсе.
Образец:
Это так же просто, как этот код, просто загрузить изображение, если imageURL
действителен (это ваш случай)
UIImageView *imageView;
[imageView setImageWithURL:[NSURL URLWithString:YOUR_URL]];
И у этого также есть богатые методы как ниже
UIImageView *imageView;
[imageView setImageWithURL:[NSURL URLWithString:YOUR_URL]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType)
{
// in "image" you'll get the downloaded image from the URL
... completion code here ...
}];
Не звони NSURLConnection
в фоновом режиме. Как NSURLConnection
будет работать автоматически. Поскольку вы не отправляете асинхронный запрос, он будет работать в фоновом режиме и не будет зависать от вашего основного потока. В ваших данных загрузки удалить отправку. У тебя есть:
if (temp)
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
[self backgroundProcess];
});
}
сделай это:
if (temp)
{
[self backgroundProcess];
}
Вам не нужно использовать диспетчеризацию.