Я могу успешно извлекать данные асинхронно через NSURLConnection
из любой другой части в базе кода, кроме функции canDrawMapRect
в моем подклассе TileOverlayView
класса.
Я изменяю MapKit
Пример называется tileMap для загрузки плиток с сервера и наложения этой информации на карту.В canDrawMapRect
я вызываю функцию в оверлейном классе, которая, в свою очередь, создает URL и открывает соединение.Я уже проверил свой класс соединения и подтвердил, что он действительно работает.Я запустил его в функциях инициализации overlay и overlayView
с успехом.URL-адреса тоже хороши, так как я могу выбросить их в браузер, и они показывают правильные pngs.Я знаю, что canDrawMapRect
работает в нескольких потоках, и у меня есть только опыт работы с потоками.
Вот мой код подключения,
- (id)initWithStringUrl: (NSString*) url {
NSLog(@"Test Connect Init URL %@", url);
self = [super init];
if (self)
{
[self loadURL:[NSURL URLWithString:url]];
}
return self;
}
+ (UIImage*)connectSynchronousWithURL:(NSString*) url {
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSURLResponse* response = [[NSURLResponse alloc] init];
NSError* error = [[NSError alloc] init];
NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
UIImage *image = [UIImage imageWithData: data];
return image;
}
- (BOOL)loadURL:(NSURL *)inURL {
NSURLRequest *request = [NSURLRequest requestWithURL:inURL];
NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
if (conn) {
receivedData = [[NSMutableData data] retain];
NSLog(@"Connection Success");
} else {
NSLog(@"Connection Failed");
return FALSE;
}
return TRUE;
}
- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)response {
NSLog(@"didReceiveResponse");
[receivedData setLength:0];
}
- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data {
NSLog(@"didReceiveData");
[receivedData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)conn {
NSLog(@"Succeeded! Received %d bytes of data", [receivedData length]);
}
Довольно стандартные вещи.Если я запускаю код в начале TileOverlayView
, он будет работать нормально, но если я запускаю его в canDrawMapRect
, то ни одна из функций делегата не будет вызвана.Полагаю, стоит также упомянуть, что синхронное соединение с сервером работает в методе canDrawMapRect
.Я совсем не понимаю T_T
Любая помощь будет принята с благодарностью.Спасибо.