在ios uiwebview objective-c中检查布尔值是yes还是no时出错
Posted
技术标签:
【中文标题】在ios uiwebview objective-c中检查布尔值是yes还是no时出错【英文标题】:error while checking if boolean value is yes or no in ios uiwebview objective-c 【发布时间】:2018-11-16 14:44:33 【问题描述】:我正在尝试检查在 ios UIWebView 中加载的 URL 是否有错误,如果 200
我想将 isRequestWebOk
设置为 YES
,我将使用以下代码获取请求 url 状态代码将使用默认的NO
,除了isRequestWebOk
仍然返回NO
,即使状态码是200 并且我确实设置了它if(200)isRequestWebOk = YES;
,一切似乎都运行良好。
请任何人帮助我,我不知道为什么不能正常工作。
-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType
static BOOL isRequestWeb = YES;
static BOOL isRequestWebOk = NO;
NSString *embedhtml = @"<html><head></head><body style='color:#000;'><p>Error</p></body></html>";
if (isRequestWeb)
//NSHTTPURLResponse *response = nil;
//NSData *data = [NSURLConnection sendSynchronousRequest:inRequest returningResponse:&response error:nil];
//if (response.statusCode == 404)
[[[NSURLSession sharedSession] dataTaskWithRequest:inRequest completionHandler:^(NSData * data, NSURLResponse * response, NSError * error)
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSInteger statusCode = httpResponse.statusCode;
if (statusCode >= 200 && statusCode < 300)
/*I think this do set but i can't access it outside the completionHandler but i really need to check it outside as i cannot do many other things inside here*/
isRequestWebOk = YES;
NSLog(@"GOOD");
else if (statusCode == 404)
NSLog(@"code for 404");
else if (statusCode == 403)
NSLog(@"code for 403");
else if (statusCode == 500)
NSLog(@"code for 500");
else
NSLog(@"code for ALL");
isRequestWebOk = YES;
NSLog(@"code is what: %ld", (long)statusCode);
] resume];
isRequestWeb = NO;
/*This is where am checking for isRequestWebOk if true or not but it always return false*/
if(isRequestWebOk)
NSLog(@"Request is okay 200");
return YES;
else
NSLog(@"Bad Request b4004");
inWeb.userInteractionEnabled = NO;
inWeb.opaque = NO;
inWeb.backgroundColor = [UIColor clearColor];
[inWeb loadHTMLString: embedHTML baseURL: nil];
return NO;
return YES;
我认为这确实设置了,但我无法在 completionHandler 之外访问它,但我真的需要在外面检查它,因为我无法在里面做很多其他事情
【问题讨论】:
欢迎来到异步编程。当您的完成处理程序被执行时,-webView:shouldStartLoadWithRequest:navigationType:
已经完成并且您的检查已经使用原始值执行。处理程序是一个块,稍后会被复制并执行,因此是异步的。
此外,WebKit 会询问您是否应该执行请求。为什么要加载请求,然后再决定是否加载?
【参考方案1】:
你需要移动这段代码:
if(isRequestWebOk)
NSLog(@"Request is okay 200");
return YES;
else
NSLog(@"Bad Request b4004");
inWeb.userInteractionEnabled = NO;
inWeb.opaque = NO;
inWeb.backgroundColor = [UIColor clearColor];
[inWeb loadHTMLString: embedHTML baseURL: nil];
return NO;
到completionHandler
里面。
当您在此处检查isRequestWebOk
是YES
还是NO
时,请求可能仍在进行中。
【讨论】:
这样做我会收到警告Thread 10: EXC_BREAKPOINT (code=1, subcode=0x1f25e5508)
和-[UIWebView setOpaque:] must be used from main thread only
,我还有其他代码将在其中使用,可能会导致更多错误
您可以保留 Mo 的解决方案,但只需通过调度到主线程来更新 UI 元素。
问题是他想通过加载数据和检查结果来决定是否加载数据。以上是关于在ios uiwebview objective-c中检查布尔值是yes还是no时出错的主要内容,如果未能解决你的问题,请参考以下文章
在ios uiwebview objective-c中检查布尔值是yes还是no时出错