Асинхронные вызовы не работают в многопоточном разделе кода (MKOverlay canDraw) - PullRequest
0 голосов
/ 30 июня 2011

Я могу успешно извлекать данные асинхронно через 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

Любая помощь будет принята с благодарностью.Спасибо.

1 Ответ

0 голосов
/ 01 июля 2011

Из документов о NSURLConnection это в значительной степени суммирует.

Обратите внимание, что эти методы делегата будут вызваны в потоке, который запустил операцию асинхронной загрузки для связанного объекта NSURLConnection.

Похоже, мне нужно будет использовать CFRunLoopRun() и CFRunLoopStop(CFRunLoopGetCurrent());, чтобы сохранить поток.Или найдите альтернативу выполнению этих асинхронных вызовов в потоке.

...