Проблема с передачей нескольких строк в stringByEvaluatingJavaScriptFromString

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

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


person iCoder4777    schedule 26.09.2011    source источник


Ответы (2)


Как предложил Али, вы можете пойти дальше ..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];
 }

Надеюсь, это поможет вам.

person Community    schedule 26.09.2011

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

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

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

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

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

person AliSoftware    schedule 26.09.2011
comment
Спасибо Али за то, что показал мне четкую картину NSThread и NSOperationQueue. Я постараюсь использовать любой из предложенных вами способов. - person iCoder4777; 26.09.2011