2013-08-01 6 views
-2

Во-первых, я действительно новичок в Obj-C, в основном, из фона php javascrript. Мои предыдущие приложения были в Phonegap. Моя проблема, с которой я столкнулся, - мне нужно загрузить веб-просмотр, но Apple продолжает отказываться от него, потому что таймер сторожевого таймера запускается на ios 6. Поэтому я попытался добавить веб-просмотр к второстепенной теме с моими прядильщиками в основном потоке, но затем я получаю эта ошибка.IOS UIWebView Crashes

Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now... 

Вот мой код, если кто-нибудь может мне точку в правильном направлении, я бы очень признателен :)

- (void)viewDidLoad 

{ 
[super viewDidLoad]; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    if (dispatch_get_current_queue() == dispatch_get_main_queue()) { 
     NSLog(@"WebView is On Main Thread!"); 
    } else { 
     NSLog(@"WebView is not On Main Thread!"); 
    } 
    NSString *fullURL = @"http://www.example.com"; 
    NSURL *url = [NSURL URLWithString: fullURL]; 
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url]; 
    _mywebview.backgroundColor = [UIColor grayColor]; 
    _mywebview.opaque=NO; 
    [_mywebview loadRequest:requestObj]; 
    _mywebview.scalesPageToFit = YES; 
}); 
} 

- (void) webViewDidStartLoad:(UIWebView *)webView 
{ 
dispatch_async(dispatch_get_main_queue(), ^{ 
    if (dispatch_get_current_queue() == dispatch_get_main_queue()) { 
     NSLog(@"Spinner Start On Main Thread!"); 
    } else { 
     NSLog(@"Spinner Start not On Main Thread!"); 
    } 
    [_myActivity startAnimating]; 
}); 
} 

- (void) webViewDidFinishLoad:(UIWebView *)webView 
{ 
dispatch_async(dispatch_get_main_queue(), ^{ 
    if (dispatch_get_current_queue() == dispatch_get_main_queue()) { 
     NSLog(@"Spinner Stop On Main Thread!"); 
    } else { 
     NSLog(@"Spinner Stop not On Main Thread!"); 
    } 
    [_myActivity stopAnimating]; 
});   
}  
@end 

Спасибо!

+0

Вы должны обновить пользовательский интерфейс в основном потоке, здесь [ссылка] [1] в SO. [1]: http://stackoverflow.com/questions/4164984/iphone-update-ui-always-on-main-thread – siutsin

+0

Я думаю, удаление все ваши заявления НОД бы это сделать, потому что webViewDidStartLoad и webViewDidFinishLoad являются асинхронными, и вы можете показать и удалить индикатор загрузки. – satheeshwaran

+0

'UIKit' не является потокобезопасным, т. Е. Его следует обрабатывать только на основном потоке. Кроме того, все функции делегата 'UIKit' вызывается в основном потоке, поэтому нет необходимости проверять/делать явный вызов основного потока из них. – Amar

ответ

0

Я думаю, что Вы можете использовать его ...

-(void) viewDidLoad { 

    [super viewDidLoad]; 

    // Do any additional setup after loading the view from its nib. 

    NSLog(@"%@",selection); 
    NSURL *URL = [NSURL URLWithString:@"http://www.example.com"]; 

    NSURLRequest *requestObj = [NSURLRequest requestWithURL:URL]; 

    [webview loadRequest:requestObj]; 


} 

-(void) showAlertforwait{ 
UIActivityIndicatorView *activity= [[UIActivityIndicatorView alloc] initWithFrame: CGRectMake(125, 80, 30, 30)]; 

    activity.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; 

    alert= [[UIAlertView alloc]initWithTitle:@"Process" 
            message:@"Please Wait ..." 
           delegate: self 
         cancelButtonTitle: nil 
         otherButtonTitles: nil]; 

    [alert addSubview:activity]; 
    [activity startAnimating]; 
    [alert show]; 

    } 

-(void)webViewDidStartLoad:(UIWebView *)webView { 

    [self showAlertforwait]; 

    } 
-(void)webViewDidFinishLoad:(UIWebView *)webView { 

    [alert dismissWithClickedButtonIndex: 0 
          animated: YES];  
    } 
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{ 

    NSLog(@"error"); 
    [alert dismissWithClickedButtonIndex: 0 
          animated: YES]; 
    }