iPhone MapView中断 [英] iPhone MapView interrupted
问题描述
我有一个mapkit /视图,它工作正常 - 但我滚动,2 - 10移动我的应用程序崩溃...这只有一个中断。
这是我的代码的一部分。我认为这是一个问题的背景线程和数组释放/覆盖问题。
一些背景信息:我在mapview启动时生成一个会话键(MapKey),并在服务器上保存一个pin。 XML只包含用于更快响应和更短XML的新引脚。
//当用户与其交互时更新地图
- (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];
}
//发布和与verarbeiten交互
- (void)getMark:(NSString *)postBody
{
NSAutoreleasePool * ccpool = [[NSAutoreleasePool alloc]在里面];
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 / xmlforHTTPHeaderField:@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];
}
//生成带注释的annotations数组设置为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:@// placeerror: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;
}
#importMyAnnotation.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坐标;
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
[mapView performSelectorOnMainThread:@selector(addAnnotations :) withObject:annotations waitUntilDone:YES];
I have a mapkit / view and it works fine - but I scroll around and after 2 - 10 moves my app crashed... and this only with a "interrupted".
Here is part of my code. I think it's a problem with the background threads and an array release / override problem.
Some background info: I generate a "session" key (MapKey) on mapview startup and save on the serverside a pin. The XML includes only new pins for a faster response and shorter 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
Just a thought: since -[MKMapView addAnnotations:] (potentially) performs UI modifications, you may want to call it in the main thread:
[mapView performSelectorOnMainThread: @selector(addAnnotations:) withObject: annotations waitUntilDone: YES];
这篇关于iPhone MapView中断的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!