在新线程中加载 UIWebView 内容

Posted

技术标签:

【中文标题】在新线程中加载 UIWebView 内容【英文标题】:Load UIWebView content in new thread 【发布时间】:2012-08-08 04:53:25 【问题描述】:

我有四个选项卡控制器,其中一个在视图控制器中有一个 UIWebView。当应用程序启动时,我创建了一个新线程来在我的 webView 中加载 web 内容,因此当 web 完成加载后,当用户通过 tab 键进入视图控制器时,它就可以查看了。

我的问题是,webVIew 根本没有在新创建的线程中加载请求,但是当我将 loadRequest 放入 viewDidLoad 时它正在工作。我花了整整一天的时间来找到解决方案,但一点运气都没有。

这是我的代码:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
     if (self)
        [NSThread detachNewThreadSelector:@selector(doStuff) toTarget:self withObject:nil];

     return self;


- (void)doStuff

     NSLog(@"Starting a new thread ...");

     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
     url = [NSURL URLWithString:@"http://www.myURL.com"];
     NSURLRequest *request = [NSURLRequest requestWithURL:url];
     [newsWebView loadRequest:request];

     [pool release];
 

有人可以解决我的问题吗?非常感谢。

【问题讨论】:

我想你在这里有几个问题。如果你要尝试这个,你需要了解 threading UIKit 对象不是线程安全的,这是一个完美的例子。 那么,有什么方法可以实现我的目标吗?另一个问题是,当我在 viewDidLoad 函数和 [super viewDidLoad] 之前在主线程中运行 loadView 时,我的 viewController 处于空白屏幕; 【参考方案1】:
 - (void)doStuff
 
 NSLog(@"Starting a new thread ...");

 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 url = [NSURL URLWithString:@"http://www.myURL.com"];
 NSURLRequest *request = [NSURLRequest requestWithURL:url];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
    [newsWebView loadRequest:request];
 );
[pool release];

【讨论】:

【参考方案2】:

UIWebView 是 UIKit 的一部分,所以你应该在主线程上操作。

- (void)doStuff

     NSLog(@"Starting a new thread ...");

     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
     url = [NSURL URLWithString:@"http://www.myURL.com"];
     NSURLRequest *request = [NSURLRequest requestWithURL:url];
     dispatch_async(dispatch_get_main_queue(), ^(void)
         [newsWebView loadRequest:request];
     );
     [pool release];
 

【讨论】:

【参考方案3】:

试试这个

func loadPdfFromDocumentDirectory(localPathUrl: URL)

    let urlRequest = URLRequest(url: localPathUrl)
    DispatchQueue.main.async 
        self.webView?.loadRequest(urlRequest)
    

【讨论】:

以上是关于在新线程中加载 UIWebView 内容的主要内容,如果未能解决你的问题,请参考以下文章

在 UIWebview 中加载 Javascript+Html 内容

在 UIWebView 中加载 html 内容 - iOS

在 UITableViewCell 中加载 UIWebView 并根据 UIWebview 的内容制作 UITabViewCell 的高度

Xamarin iOS 在 UIWebView 中加载内容

知道何时在 UIWebView 中加载了 AJAX

在新的 AppDomain 中加载插件