将多个字符串传递给stringByEvaluatingJavaScriptFromString时出现问题

时间:2011-09-26 11:28:18

标签: javascript iphone uiwebview nsthread

我遇到了一个奇怪的问题。我目前正在使用iPhone上的mapkit。我需要在我的地图中显示两条路线,其中有一个源城市和两个不同的目的地。对于两个城市之间的路线,我的代码很好。为了这个目的,在我的代码的一个地方,我就是这样做......。

- (void)loadWithStartPoint:(NSString *)startPoint endPoint:(NSString *)endPoint options:(UICGDirectionsOptions *)options {
[googleMapsAPI stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"loadDirections('%@', '%@', %@)", startPoint, endPoint, [options JSONRepresentation]]];
}

在上面的代码中,由于绘制了哪条路由,stringByEvaluatingJavaScriptFromString将javascript传递给我的委托方法。  现在,我必须绘制两条不同的路线,为此我已经改变了上面这样的代码..

- (void)loadWithStartPoint:(NSString *)startPoint endPoint:(NSMutableArray *)endPoints options:(UICGDirectionsOptions *)options {
    for (int idx = 0; idx < [endPoints count];idx ++) 
    {
        NSString* msg = [NSString stringWithFormat:@"loadDirections('%@', '%@', %@)", startPoint, [endPoints objectAtIndex:idx], [options JSONRepresentation]];
        mstr = [msg retain];
        if (idx == 0)
        {
            [googleMapsAPI stringByEvaluatingJavaScriptFromString:msg];
        }
        else {
            [NSThread detachNewThreadSelector:@selector(loadroute:) toTarget:self withObject:mstr];
        }
    }
}

我有以下内容来创建和实现NSThread。

-(void)loadroute :(NSString *)message
{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    [self performSelectorOnMainThread:@selector(loadComplete:) withObject:message waitUntilDone:YES];
    [pool release];

}

-(void)loadComplete:(NSString *)message
{
    [googleMapsAPI stringByEvaluatingJavaScriptFromString:message];
}

在这里,我创建了另一个线程,因为我可以将字符串分别传递给stringByEvaluatingJavaScriptFromString。 但只有最后一个字符串被传递给委托方法。我错过了什么?请帮帮我。自从上周以来我就陷入了这个奇怪的问题。任何帮助,将不胜感激。 Thnx提前。

2 个答案:

答案 0 :(得分:2)

正如阿里建议你可以去wid .. performSelector:withObject:afterDelay:它会给你想要的结果.. 你可以把你的代码写成......

 - (void)loadWithStartPoint:(NSString *)startPoint endPoint:(NSMutableArray *)endPoints options:(UICGDirectionsOptions *)options {
            for (int idx = 0; idx < [endPoints count];idx ++) 
            {
    NSString* msg = [NSString stringWithFormat:@"loadDirections('%@', '%@', %@)", startPoint, [endPoints objectAtIndex:idx], [options JSONRepresentation]];
            mstr = [msg retain];

             [self performSelector:@selector(loadComplete:) withObject:nil afterDelay:0.5];
            }
        }

-(void)loadComplete:(NSString *)message
 {
        [googleMapsAPI stringByEvaluatingJavaScriptFromString:message];
 }

希望这会帮助你。

答案 1 :(得分:0)

我想这是因为多线程不兼容UIWebView。

您应该使用NSOperationQueue或GCD来堆叠stringByEvaluatingJavaScriptFromString的调用,以便它们在后台异步执行,但仍然在主线程中执行它们(使用dispatch_get_main_queue()或{ {1}}等。)

如果没有关于多线程的真正问题,你也可以直接调用performSelectorOnMainThread:(为什么要创建一个线程?你仍然可以多次调用该方法,即使你想单独传递字符串,不是吗? ?)

您也可以尝试使用stringByEvaluatingJavaScriptFromString(延迟为0或0.01),以便在下一次runloop迭代期间执行调用。

通常,如果您不需要使用它们,请避免使用线程(有关Apple文档中的详细信息,请参阅“并发编程指南”和“线程编程指南”)。首选使用异步方法,然后使用NSOperationQueues或GCD(只有在没有任何其他解决方案的情况下,才可以使用NSThreads)。这是因为更高的API将为您管理棘手的东西,并在处理多线程时使问题变得不那么复杂。