【发布时间】:2010-05-10 10:23:02
【问题描述】:
考虑一个具有这些方法的类:
- (id) initWithFrame: (CGRect) frame
{
if (!(self = [super init]))
return nil;
webView = [[UIWebView alloc] initWithFrame:frame];
[webView setDelegate:self];
lock = [[NSConditionLock alloc] initWithCondition:LOCK_WAIT];
return self;
}
- (void) setHTML: (NSString *) html
{
[lock lockWhenCondition:LOCK_WAIT];
[webView loadHTMLString:html baseURL:nil];
[lock unlock];
}
- (void)webViewDidFinishLoad:(UIWebView *)aWebView
{
[lock lockWhenCondition:LOCK_WAIT];
// Locking to be able to unlock and change the condition.
[lock unlockWithCondition:LOCK_GO];
}
- (NSString *) stringByEvaluatingJavaScriptFromString: (NSString *) jsCommand
{
[lock lockWhenCondition:LOCK_GO];
NSString * res = [webView stringByEvaluatingJavaScriptFromString:jsCommand];
[lock unlock];
return res;
}
我们称这个类为SynchronousUIWebView。 从我执行的主线程:
webView = [[SynchronousUIWebView alloc] initWithFrame:frame];
[webView setHTML:html];
[webView stringByEvaluatingJavaScriptFromString:jsCommand];
问题似乎是在我离开当前调用堆栈之前不会调用委托,因为我正在等待委托调用发生,也就是死锁。对我来说,委托调用似乎被推送到当前调用完成时调用的队列。所以问题是我可以修改这种行为吗?
注意:需要这样做的原因是在加载 HTML 之前我无法执行 JavaScript。
【问题讨论】:
标签: ios iphone uiwebview delegates deadlock