Форум программистов, компьютерный форум CyberForum.ru

Карта Apple подтормаживает при прокрутке - Программирование iOS/iPhone

Войти
Регистрация
Восстановить пароль
 
albert102
 Аватар для albert102
-21 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 53
19.05.2014, 00:04     Карта Apple подтормаживает при прокрутке #1
Дорогие друзья, доброй ночи!

использую компонент MkMapView, добавляю на карту 20 картинок (аннотации 60x60 пикселей по 12 кб каждая) и при прокрутке влево-вправо-вверх-вниз карта начинает тормозить. Неприятно.

Подскажите, пожалуйста, как можно уменьшить подтормаживание карты или избавиться вообще?

Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
19.05.2014, 07:54     Карта Apple подтормаживает при прокрутке #2
albert102, каким образом добавляете?
Покажите код, будет проще вам помочь.
albert102
 Аватар для albert102
-21 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 53
19.05.2014, 08:19  [ТС]     Карта Apple подтормаживает при прокрутке #3
делаю так

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    
    
    if([annotation isKindOfClass:[PlaceMark class]]){
        MKAnnotationView *annotationView=[myMapView dequeueReusableAnnotationViewWithIdentifier:nil];
        
        if(annotationView == nil){
            annotationView=[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
            annotationView.enabled = YES;
            
            // +++ получаем ID юзера из title и формируем ссылку +++
            
            NSString * getID = [annotationView.annotation title];
            NSString * link = [NSString stringWithFormat:@"http://мойсайт.ru/gallery/%@/image.jpg", getID];
            
            
            // +++ загружаем аватарку в отдельном потоке +++
            
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
                UIImage * image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:link]]];
                dispatch_async(dispatch_get_main_queue(), ^{
                    
                    // как только аватарка загрузится, применяем ее к аннотации
                    annotationView.image = image;
                    
                    
                });
            });
            
        }
        return annotationView;
    }
    return nil;
}

placeMark это у меня отдельный класс, с помощью него я добавляю к аннотации ее координаты, заголовок (в который id юзера закладываю) и подзаголовок (с возрастом юзера). вызываю событие addAnnotation в цикле (получаю с сервера массив юзеров и по очереди добавляю их на карту)

Objective-C
1
2
3
4
5
 placeMark = [[PlaceMark alloc]
                     initWithCoordinate:CLLocationCoordinate2DMake(s_lat, s_long)
                     andMarkTitle:s_userID
                     andMarkSubTitle:s_friend];
        [myMapView addAnnotation:placeMark];
Добавлено через 6 минут
когда на карту добавляю 5-10 аватарок, все пока что нормально, но после 15-20 начинает тормозить. представляю как будет тормозить если будет 50-100 аватарок.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
19.05.2014, 08:43     Карта Apple подтормаживает при прокрутке #4
Цитата Сообщение от albert102 Посмотреть сообщение
annotationView=[myMapView dequeueReusableAnnotationViewWithIdentifier:nil];
if(annotationView == nil){
Identifier используйте, чтобы переиспользуемость была, alloc дорогостоящая операция, незнаю что там в init еще.

Дальше:
Аватарки лучше загружать в вашем классе PlaceMark внутри. Ибо если вы будете делать так:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
if (annotationView == nil) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
                UIImage * image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:link]]];
                dispatch_async(dispatch_get_main_queue(), ^{
                    
                    // как только аватарка загрузится, применяем ее к аннотации
                    annotationView.image = image;
                    
                    
                });
            });
}
и annotationView будет != nil - у вас аватарка будет неправильно выставлена.

Сделайте метод с блоком по типу:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (UIImage *)avatarImageWithCompletion:(void(^)(UIImage *image, NSError *error))completion {
    if (self.avatarImage) {
        return self.avatarImage;
    } else {
        if (!self.downloading) {
            self.downloading = YES;
            __typeof(self) wThis = self;
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
                UIImage * image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:link]]];
                dispatch_async(dispatch_get_main_queue(), ^{
                    __typeof(wThis) sThis = wThis;
                    sThis.downloading = NO;
                    if (image) {
                        sThis.avatarImage= image;
                        completion(sThis.avatarImage, nil);
                    } else {
                        completion(nil, [NSError errorWithDomain...]);
                    }
                });
            });
        }
    }
}
albert102
 Аватар для albert102
-21 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 53
19.05.2014, 08:52  [ТС]     Карта Apple подтормаживает при прокрутке #5
спасибо за совет!
Identifier добавлять, чтобы потом обратиться к этой аннотации, например, из класса placeMark?

Добавлено через 2 минуты
placemark выглядит так у меня:

placeMark.h

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
 
@interface PlaceMark : NSObject <MKAnnotation> {
    CLLocationCoordinate2D coordinate;
    NSString *markTitle, *markSubTitle;
}
 
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic, retain) NSString *markTitle, *markSubTitle;
 
 
-(id)initWithCoordinate:(CLLocationCoordinate2D)theCoordinate
           andMarkTitle:(NSString *)theMarkTitle
        andMarkSubTitle:(NSString *)theMarkSubTitle;
 
@end
placeMark.m

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#import "PlaceMark.h"
 
@implementation PlaceMark
@synthesize coordinate;
@synthesize markTitle, markSubTitle;
 
-(id)initWithCoordinate:(CLLocationCoordinate2D)theCoordinate andMarkTitle:(NSString *)theMarkTitle andMarkSubTitle:(NSString *)theMarkSubTitle{
    coordinate = theCoordinate;
    markTitle = theMarkTitle;
    markSubTitle = theMarkSubTitle;
    return self;
}
 
 
- (NSString *)title {
    return markTitle;
}
 
- (NSString *)subtitle {
    return markSubTitle;
}
 
 
@end
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
19.05.2014, 09:19     Карта Apple подтормаживает при прокрутке #6
Цитата Сообщение от albert102 Посмотреть сообщение
Identifier добавлять, чтобы потом обратиться к этой аннотации, например, из класса placeMark?
Нет, для того, чтобы не пересоздавать каждый раз кучу отображений для аннотаций. Поэтому вероятно и лагает.
Цитата Сообщение от albert102 Посмотреть сообщение
placemark выглядит так у меня:
Ну вот и добавьте загрузку картинки в этот же класс. Чтобы он отвечал за все данные, чтобы загрузка картинок не была "где-то" в контроллере.
albert102
 Аватар для albert102
-21 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 53
19.05.2014, 09:21  [ТС]     Карта Apple подтормаживает при прокрутке #7
но я так понимаю Identifier нужен рандомный для каждой аннотации ведь?
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
19.05.2014, 09:40     Карта Apple подтормаживает при прокрутке #8
Нет, смысла в рандомном идентификаторе не очень много, читайте документацию.
albert102
 Аватар для albert102
-21 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 53
19.05.2014, 09:48  [ТС]     Карта Apple подтормаживает при прокрутке #9
почитал документацию, понял принцип.
понял что не совсем верно в коде сделал.

однако я понять не могу следующее:
допустим я загрузил массив из 10 аватарок, если для каждой аватарки будет использован один Identifier - в чем смысл тогда?
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
19.05.2014, 10:09     Карта Apple подтормаживает при прокрутке #10
Цитата Сообщение от albert102 Посмотреть сообщение
допустим я загрузил массив из 10 аватарок, если для каждой аватарки будет использован один Identifier - в чем смысл тогда?
В том, что 10 штук создастся отображений, вы потом карту помотаете туда-сюда, и "новые" отображения не буду создаваться, а возьмутся те, что не на экране, а просто созданы были. Переиспользуемость.
albert102
 Аватар для albert102
-21 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 53
20.05.2014, 07:32  [ТС]     Карта Apple подтормаживает при прокрутке #11
все, окончательно понял.
я не сразу понял, что при скроллинге, карта их снова перегружает.

огромное спасибо!

Добавлено через 21 час 18 минут
скажите, пожалуйста, откуда такая инфа, что карта перерисовывает\перезагружает все аннотации при малейшем скроллинге?

натыкал nslog в нескольких местах внутри viewForAnnotation - в итоге выяснил, что срабатывает только после addAnnotation
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
20.05.2014, 10:39     Карта Apple подтормаживает при прокрутке #12
Цитата Сообщение от albert102 Посмотреть сообщение
при малейшем скроллинге?
А вы где увидели что я такое писал?
noname_club
 Аватар для noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 577
20.05.2014, 11:00     Карта Apple подтормаживает при прокрутке #13
все просто, аннотации на карте работают как ячейки в UITableView

Если вы знаете как работают ячейки, как они "пересоздаются" и "кешируются" то не сложно понять как точно такойже механизм работает на карте.
albert102
 Аватар для albert102
-21 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 53
20.05.2014, 13:18  [ТС]     Карта Apple подтормаживает при прокрутке #14
что то я совсем запутался.

доработал так, все авы загоняю в кэш после первой скачки, чтобы постоянно одну и туже аву не скачивать.
и применяю к аннотации. - дало +, теперь авы появляются быстро при втором и последующих отображениях.

далее, к сожалению, один identifier использовать не получилось, так как потом при клике на аву, у меня задумано модальное окно с авой большего размера, так вот в этом окне появляется другая ава. в итоге привязал identifier к id каждого юзера, чтобы не запуталось - работает как надо. но при этом подтормаживание как было так и осталось.

тем более, что reused как я понимаю используется при втором и последующих отображениях - но у меня подтормаживание появляется сразу при первом отображении аннотаций.

сегодня подрузку аватарок выведу в другую функцию и посмотрю как будет.

что касается tableview, но ведь там чуть подругому, таблички перезагружаются когда вначале уходят за видимую область экрана и потом возвращаются? до этого писал приложение, которое tableview использует и выводит 50 аватарок - никаких торможений небыло. понравилась автоматическая подгрузка.

Добавлено через 55 минут
от размера файла авы кстати торможение на зависит,
попробовал сейчас вместо 20 аватарок по 12 кб, добавить 1 аннотацию с картинкой 1.5 мб. - все летает.

собственно подтормаживание возникает когда масштаб карты очень маленький, и все 20 авок видны на экране.
когда масштаб до улиц увеличить, когда половина аватарок за пределом экрана находится - подтормаживания нет.
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
20.05.2014, 14:23     Карта Apple подтормаживает при прокрутке #15

Не по теме:

albert102, я бы вам сказал открыть инструметы и профайлингом на узкие места использования CPU посмотреть, но врят-ли это поможет, если вы после 2х дней колупания до сих пор не разобрались что такое reuseIdentifier и для чего он нужен.


Но все равно. Вы написали много слов да все не по делу.
Откройте профайлер и смотрите использование CPU/памяти в разные моменты использования приложения.

Цитата Сообщение от albert102 Посмотреть сообщение
понравилась автоматическая подгрузка.
Что это такое "автоматическая подгрузка"?
albert102
 Аватар для albert102
-21 / 1 / 0
Регистрация: 30.10.2013
Сообщений: 53
20.05.2014, 14:37  [ТС]     Карта Apple подтормаживает при прокрутке #16
вы можете объяснить нормально?
вначале вы говорите это необходимо, чтобы снова не пересоздавать отображения с разными идентификаторами.
хорошо, почему же тогда карта тормозит при самом первом отображении? значит переиспользование тут не причем, я понимаю, если бы я обновлял аннотации, и спустя 10 обновлений куча мусора было бы, тогда да - тормозило бы логично.

более того, при каждом новом обновлении аннотаций, я очищаю карту, и снова вывожу все позиции юзеров с их аватарками. причем здесь переиспользование?

в общем я другим путем пошел, так как подтормаживание наблюдается при скроллинге во время уменьшенного масштаба до страны, то просто вывожу 1-2 аватарки. при увеличение масштаба допоказываю остальные авы.

Добавлено через 2 минуты
Что это такое "автоматическая подгрузка"?
я когда приложение писал, оно само подгружало автоматически все остальные ячейки таблицы по мере прокрутки.
логично, зачем загружать 50 ячейку сразу, если на экране сейчас видны первые 10 ячеек.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2014, 22:14     Карта Apple подтормаживает при прокрутке
Еще ссылки по теме:

Коннект iphone и apple tv через airplay Objective-C
Как восстановить developer account apple?
Получить apple id устройства Objective-C
Выход из Apple ID

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
20.05.2014, 22:14     Карта Apple подтормаживает при прокрутке #17
albert102, опять все то же самое. Много слов и все мимо. Не смогут вам помочь, увы, если вы просто будете говорить "у меня тормозит карта". А реального кода за этим - 0.
Был у меня опыт когда люди мелкие файлики тащили по сети в главном потоке и жаловались что UI виснет.
И ничем не мог помочь... Пока не узнал, чем они думали...
Тут все зависит от вас. Либо разбирайтесь сами, либо показывайте как вы это все сделали. Причем не кусочек, а всю работу с картой.
Yandex
Объявления
20.05.2014, 22:14     Карта Apple подтормаживает при прокрутке
Ответ Создать тему
Опции темы

Текущее время: 06:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru