2017-03-08 7 views
1

에서 호출해야합니다 나는 때문에 캐치되지 않는 예외 GMSThreadExceptionGMSThreadException '이유 :'이 API 메소드가 메인 쓰레드 '

-(void)drawRoute 

{

dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL); 
dispatch_async(myQueue, ^{ 

    [self fetchPolylineWithOrigin:origin destination:destination completionHandler:^(GMSPolyline *polyline) 
    { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      // Update the UI 
      if(polyline) 
       polyline.map = mapView; 
      [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
     }); 

    }]; 

}); 
응용 프로그램 종료 구글 API를 사용하여 그리기 폴리 라인 동안이 오류에 직면

}

답변

1

메인 스레드에서 GMSPath와 GMSPolyline을 사용하면 작동합니다. 이 두 곳

하나는 메인 스레드를 사용하는 요구의 내 경우

0

오류 메시지에서 기본 스레드에서만 해당 API 메소드를 호출 할 수 있습니다.

-(void)drawRoute 
{ 

dispatch_async(dispatch_get_main_queue(), ^{ 

    [self fetchPolylineWithOrigin:origin destination:destination completionHandler:^(GMSPolyline *polyline) 
    { 
     // Update the UI 
     if(polyline) 
      polyline.map = mapView; 
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    }]; 

}); 
} 

이렇게하면 코드가 사라지는 동안 계속 진행하면서 비동기 적으로 수행하지만 코드를 주 스레드 (대기열)에 보관할 수 있습니다. 메소드에 완료 핸들러가 있다는 사실은 비동기 자체임을 시사하며, 여기서는 디스패치를 ​​수행 할 필요가 없을 수도 있습니다.

-(void)drawRoute 
{ 

    [self fetchPolylineWithOrigin:origin destination:destination completionHandler:^(GMSPolyline *polyline) 
    { 
     // Update the UI 
     if(polyline) 
      polyline.map = mapView; 
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    }]; 

} 

또는 이전에이 성능 문제를 경험했다 :

내 좋은 방법은 당신이 할 괜찮을 것이라는 것입니까?

0

...

두 번째는

__block GMSMapView *mapView; 
dispatch_async(dispatch_get_main_queue(), ^{ 
    // Create GMSMapView 
    mapView = [GMSMapView mapWithFrame:CGRectMake(1, 1, _subView.frame.size.width-2, _subView.frame.size.height-2) camera:camera]; 
    mapView.myLocationEnabled = YES; 
    [_subView addSubview:mapView]; 
}); 
입니다 ...

- (void)fetchPolylineWithOrigin:(CLLocation *)origin destination:(CLLocation *)destination completionHandler:(void (^)(GMSPolyline *))completionHandler { 

    // Code here .... 

    __block GMSPolyline *polyline = nil; 
    dispatch_async(dispatch_get_main_queue(), ^{ // Second main 
     if ([routesArray count] > 0) { 
      NSDictionary *routeDict = [routesArray objectAtIndex:0]; 
      NSDictionary *routeOverviewPolyline = [routeDict objectForKey:@"overview_polyline"]; 
      NSString *points = [routeOverviewPolyline objectForKey:@"points"]; 
      GMSPath *path = [GMSPath pathFromEncodedPath:points]; 
      polyline = [GMSPolyline polylineWithPath:path]; 
     } 
    }); 
}