2010-01-03 4 views
1

mapkit/view가 있는데 잘 작동합니다.하지만 2 - 10이 움직 인 후 내 앱이 추락했습니다 ...이 경우에만 "중단됨"이 표시됩니다.iPhone MapView가 중단되었습니다.

여기 내 코드의 일부입니다. 나는 그것이 배경 스레드와 배열 release/override 문제에 대한 문제라고 생각한다.

일부 배경 정보 : mapview 시작시 "세션"키 (MapKey)를 생성하고 서버 측 핀에 저장합니다. XML에는 빠른 응답과 짧은 XML을위한 새로운 핀만 포함됩니다.

// Update map when the user interacts with it 
- (void)mapView:(MKMapView *)aMapView regionDidChangeAnimated:(BOOL)animated 
{ 
    MyAnnotation *annotation = [[MyAnnotation alloc] init]; 
    MyAnnotation *ann = [[MyAnnotation alloc] init]; 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
    NSString *postBody = [[[NSString alloc] initWithFormat:@"single=0&lat=%f&lng=%f&sid=%@", mapView.centerCoordinate.latitude, mapView.centerCoordinate.longitude, [prefs stringForKey:@"MapKey"], [prefs stringForKey:@"MapKey"]] autorelease]; 
    [self performSelectorInBackground:@selector(getMark:) withObject:postBody]; 
} 
// make post and interact with verarbeiten 
-(void) getMark:(NSString *)postBody 
{ 
    NSAutoreleasePool *ccpool = [[NSAutoreleasePool alloc] init]; 
    NSString *urlStr = [[[NSString alloc] initWithFormat:@"http://URL/get.php"] autorelease]; 
    NSMutableURLRequest *request; 
    NSData *postData = [postBody dataUsingEncoding:NSUTF8StringEncoding]; 
    NSError *error; 
    NSURLResponse *response; 
    NSData *dataReply; 
    id stringReply; 

    request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString:urlStr]]; 

    [request setHTTPMethod: @"POST"]; 
    [request setHTTPBody:postData]; 
    [request setValue:@"text/xml" forHTTPHeaderField:@"Accept"]; 

    dataReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
    stringReply = (NSString *)[[[NSString alloc] initWithData:dataReply encoding:NSUTF8StringEncoding] autorelease]; 
    [self performSelectorInBackground:@selector(verarbeiten:) withObject:stringReply]; 

    [ccpool release]; 
} 

//generate annotations array with annotations an set it to mapview 
-(void) verarbeiten:(NSString *)stringReply 
{ 
    NSAutoreleasePool *bbpool = [[NSAutoreleasePool alloc] init]; 
    CXMLDocument *rssParser = [[[CXMLDocument alloc] initWithXMLString:stringReply options:0 error:nil] autorelease]; 
    NSMutableArray* annotations = [[NSMutableArray alloc] init]; 
    NSArray *resultNodes = nil; 
    resultNodes = nil; 
    resultNodes = [rssParser nodesForXPath:@"//place" error:nil]; 
    for (CXMLElement *resultElement in resultNodes) 
    { 
     MyAnnotation *ann = [[MyAnnotation alloc] init]; 
     ann.title = [[resultElement childAtIndex:3] stringValue]; 
     ann.subtitle = [[resultElement childAtIndex:5] stringValue]; 
     ann.currentPoint = [NSNumber numberWithInt:[[[resultElement childAtIndex:1] stringValue] intValue]]; 
     MKCoordinateRegion region = { {0.0, 0.0 }, { 0.0, 0.0 } }; 
     region.center.latitude = [[[resultElement childAtIndex:9] stringValue] floatValue]; 
     region.center.longitude = [[[resultElement childAtIndex:7] stringValue] floatValue]; 
     ann.coordinate = region.center; 
     //[mapView addAnnotation:ann ]; 

     [annotations addObject:ann]; 
    } 
    [mapView addAnnotations:annotations ]; 
    [annotations release]; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    [bbpool release]; 
} 

- (MKAnnotationView *) mapView:(MKMapView *)mV viewForAnnotation:(MyAnnotation *) annotation 

{ 
    MKPinAnnotationView *pinView = nil; 
    if(annotation != mapView.userLocation) 
    { 
     static NSString *defaultPinID = @"de.my.pin"; 
     pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; 
     if (pinView == nil) 
      pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID] autorelease]; 

     pinView.pinColor = MKPinAnnotationColorRed; 
     pinView.canShowCallout = YES; 
     pinView.animatesDrop = NO; 
     pinView.userInteractionEnabled = YES; 
     UIButton *btnVenue = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
     btnVenue.tag = [annotation.currentPoint intValue]; 
     [btnVenue addTarget:self action:@selector(showLinks:) forControlEvents:UIControlEventTouchUpInside];         
     pinView.rightCalloutAccessoryView = btnVenue; 
    } 
    else 
    { 
     [mapView.userLocation setTitle:@"You are here"]; 
    } 

    return pinView; 
} 



#import "MyAnnotation.h" 


@implementation MyAnnotation 

@synthesize coordinate, title, subtitle,currentPoint; 

-(void)dealloc 
{ 
    [title release]; 
    [subtitle release]; 
    [super dealloc]; 
} 

@end 



#import <Foundation/Foundation.h> 
#import <MapKit/MKAnnotation.h> 

@interface MyAnnotation : NSObject <MKAnnotation> 
{ 
    CLLocationCoordinate2D coordinate; 
    NSString *title; 
    NSString *subtitle; 
    NSNumber *currentPoint; 
} 

@property (nonatomic, assign) CLLocationCoordinate2D coordinate; 
@property (nonatomic, copy) NSString *title; 
@property (nonatomic, copy) NSString *subtitle; 
@property(nonatomic, retain) NSNumber *currentPoint; 

@end 

답변

1

그냥 생각 보낸 사람 - [MKMapView의 addAnnotations는 :] :

[mapView performSelectorOnMainThread: @selector(addAnnotations:) withObject: annotations waitUntilDone: YES]; 
(잠재적)는 메인 스레드에서 호출 할 수 있습니다, UI 수정을 수행
관련 문제