【问题标题】:Load UIWebView content in new thread在新线程中加载 UIWebView 内容
【发布时间】: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 处于空白屏幕;

标签: ios multithreading uiwebview


【解决方案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)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-13
        • 1970-01-01
        • 1970-01-01
        • 2014-04-03
        相关资源
        最近更新 更多