2011-09-26 31 views
0

我陷入了一个奇怪的问题。我目前正在研究iPhone上的mapkit。我需要在我的地图中显示两条路线,其中有一个来源城市和两个不同的目的地。对于两个城市之间的路线,我的代码很好。为此目的在我的代码中的一个地方,我正在这样做......。将多个字符串传递给stringByEvaluatingJavaScriptFromString的问题

- (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

如阿里建议ü可以去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]; 
} 

希望这将有助于你出来。

0

我想这是由于多线程不符合UIWebView。

您应该使用NSOperationQueue或GCD堆栈你让他们在后台异步地执行的stringByEvaluatingJavaScriptFromString电话,但仍然在主线程中执行它们(使用dispatch_get_main_queue()performSelectorOnMainThread:等)。

如果没有关于多线程的实际问题,您也可以直接调用stringByEvaluatingJavaScriptFromString(为什么创建一个线程?即使您想单独传递字符串,您仍可以多次调用该方法,是吗?)

您也可以尝试使用performSelector:withObject:afterDelay:(延迟为0或0.01),以便在下一次迭代期间执行调用。通常,如果你真的不需要使用它们,请避免使用线程(有关Apple文档中的详细信息,请参阅“并发编程指南”和“线程编程指南”)。当它们存在时,首选使用异步方法,然后使用NSOperationQueues或GCD(并且只有在您没有任何其他解决方案时,才可以使用NSThreads)。这是因为更高级的API会为您处理棘手的问题,并且在处理多线程时让问题变得不那么复杂。

+0

Thnx Ali为我展示了NSThread&NSOperationQueue的清晰画面。我会尝试使用你建议的任何一种方式。 – iCoder4777