在新线程中加载UIWebView内容

时间:2012-08-08 04:53:26

标签: ios multithreading uiwebview

我有四个制表符控制器,其中一个在视图控制器中有一个UIWebView。我创建了一个新的线程,以便在应用程序启动时在我的webView中加载Web内容,因此当Web加载完成后,用户可以在选择它们到视图控制器时进行查看。

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

这是我的代码:

- (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];
 }

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

3 个答案:

答案 0 :(得分:2)

 - (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];
}

答案 1 :(得分:1)

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];
 }

答案 2 :(得分:-1)

试试这个

func loadPdfFromDocumentDirectory(localPathUrl: URL)
{
    let urlRequest = URLRequest(url: localPathUrl)
    DispatchQueue.main.async {
        self.webView?.loadRequest(urlRequest)
    }
}