Проблема в передаче нескольких строк в stringByEvaluatingJavaScriptFromString - PullRequest
0 голосов
/ 26 сентября 2011

Я застрял в странной проблеме.В настоящее время я работаю над mapkit на iPhone.Мне нужно показать два маршрута на моей карте, для которых есть исходный город и два разных пункта назначения.Для маршрута между двумя городами мой код был в порядке.для этой цели в одном месте в моем коде я делал это следующим образом…Теперь мне нужно нарисовать два разных маршрута, для этого я изменил приведенный выше код следующим образом:

- (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 отдельно.Но только последняя строка передается в метод делегата. Что мне не хватает?пожалуйста, помогите мне.Я застрял в этой странной проблеме с прошлой недели.Любая помощь будет оценена.Спасибо заранее.

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Как подсказал Али, ты можешь пойти ... 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 голосов
/ 26 сентября 2011

Я полагаю, это связано с тем, что многопоточность не очень совместима с UIWebView.

Вы должны использовать NSOperationQueue или GCD для стека ваших вызовов stringByEvaluatingJavaScriptFromString, чтобы они выполнялись асинхронно в фоновом режимено по-прежнему выполняйте их в основном потоке (используйте dispatch_get_main_queue() или performSelectorOnMainThread: и т. д.).

Если в многопоточности нет реальной проблемы, вы также можете просто вызвать stringByEvaluatingJavaScriptFromString напрямую (зачем создавать поток?Вы все равно можете вызывать метод несколько раз, даже если вы хотите передавать строки отдельно, не так ли?)

Вы также можете попробовать использовать performSelector:withObject:afterDelay: (с задержкой 0 или 0,01), чтобы вызовбудет выполняться во время следующей итерации runloop.

В общем, если вам не нужно их использовать, избегайте использования потоков (см. «Руководство по программированию параллелизма» и «Руководство по программированию потоков»)информация в доку Apple).Предпочитайте использовать асинхронные методы, когда они существуют, затем NSOperationQueues или GCD (и только если у вас нет другого решения, вы можете использовать NSThreads).Это связано с тем, что более высокие API будут управлять сложными задачами и уменьшать сложность при работе с многопоточностью.

...