Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прогрузка и ленивая загрузка UIView перед доба... 
:(
    Опции темы
Shklyar
Дата 28.2.2014, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 28.11.2007
Где: Kyiv

Репутация: нет
Всего: 3



Есть желание показать UIView c тяжелой картинкой. Я пытаюсь сделать такую загрузку, которая позволит остальной программке работать

Класс этой вью
Код

- (id)initWithSpinset:(NSString*)spinset withSize:(CGSize)size {
    self = [super initWithFrame:(CGRect){0, 0, size}];
    if (!self) return nil;
    
    self.clipsToBounds = YES;
    
    [NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:spinset];
    
    return self;
}

- (void)loadImage:(NSString*)spinset {
    NSString *filePath = [[NSBundle mainBundle] pathForResource:spinset ofType:nil];
    NSData *imageData = [[NSData alloc] initWithContentsOfFile:filePath];
    UIImage *spinsetImage = [[UIImage alloc] initWithData:imageData];
    if (!spinsetImage) return;
    
    _spinsetImageView = [[UIImageView alloc] initWithImage:spinsetImage];
    if (_spinsetImageViewPosition)
        _spinsetImageView.frame = CGRectOffset(_spinsetImageView.frame, 0, _spinsetImageViewPosition);
    [self addSubview:_spinsetImageView];
    
    self.isReady = YES;
}


Потом, в другом месте, создаю экземпляр вышеприведенного класса и по KVO слежу за свойством isReady. По isReady == YES добавляю вью на главную вью и там еще всякого делаю.

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

Это сообщение отредактировал(а) Shklyar - 28.2.2014, 13:30
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
sadisasha
Дата 28.2.2014, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 15.12.2006

Репутация: нет
Всего: нет



Код

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    /* Код, который должен выполниться в фоне */

dispatch_sync(dispatch_get_main_queue(), ^{ 
/* Код, который нужно выполнить в главном 
потоке */
 /* Мы ждем, пока он выполниться */

 });

/* Продолжаем работать в фоновом потоке */ });

http://idev.by/ios/21112/ - про механизм распаралеливания задач GCD
PM MAIL   Вверх
lesovoi87
Дата 24.3.2014, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 24.3.2014
Где: Москва

Репутация: нет
Всего: нет



А зачем вообще нужна подгрузка тяжелого файлика? Я думаю это лишняя заморочка
PM MAIL WWW IM   Вверх
Shklyar
Дата 24.3.2014, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 28.11.2007
Где: Kyiv

Репутация: нет
Всего: 3



Цитата(lesovoi87 @  24.3.2014,  13:14 Найти цитируемый пост)
А зачем вообще нужна подгрузка тяжелого файлика? Я думаю это лишняя заморочка 

В этом случае я делал вращение объекта 360 градусов на изображении. Т.е. много фотографий в одной картинке и по тачу изменял видимый фрейм, довольно быстро.
Как лучше делать такую задачу?

--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Bitter
Дата 24.3.2014, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



Цитата(Shklyar @  24.3.2014,  14:12 Найти цитируемый пост)
Как лучше делать такую задачу?

Задача поворота картинки?
PM MAIL ICQ Skype   Вверх
Shklyar
Дата 24.3.2014, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 28.11.2007
Где: Kyiv

Репутация: нет
Всего: 3



Цитата(Bitter @  24.3.2014,  17:34 Найти цитируемый пост)
Задача поворота картинки?

)) Есть набор кадров вращения объекта. Это может быть одна огромная картинка или много меньших. По тачу я показываю разные картинки и выходит, якобы, вращаем объект.
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Bitter
Дата 24.3.2014, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



а ясно, псевдо 3Д? проблема та же, что и в первом посте осталась?
PM MAIL ICQ Skype   Вверх
Shklyar
Дата 24.3.2014, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 28.11.2007
Где: Kyiv

Репутация: нет
Всего: 3



Собственно, проблема закончена, хотя без костылей не обошлось ))
Плюс KVO оказалась не такой простой штуковиной, как казалось ранее (там проблема существования объекта, которому посылается сообщение была).

А вот сегодня, набрел на такую штуковину, что вроде не в главном потоке менять свойства некоторых UI штуковин нельзя. Как бы это сказать правильнее, на примере? Создаю новый поток (хоть через NSThread, хоть GCD), в этом потоке создаю UITextView - создается. Меняю текст шрифта - ошибка, в которой говорится, что выполнять операцию можно только в главном потоке. Вы такое встречали? Или это я в ином месте накосячил? ))
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Bitter
Дата 25.3.2014, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



Цитата(Shklyar @  24.3.2014,  22:32 Найти цитируемый пост)
Или это я в ином месте накосячил?

Нет, не на косячил, любой параметр касающийся UI можно менять только в главном потоке.
Для изменения такого параметра можно использовать dispatch_async(dispatch_get_main_queue, ...
PM MAIL ICQ Skype   Вверх
Shklyar
Дата 1.4.2014, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 28.11.2007
Где: Kyiv

Репутация: нет
Всего: 3



Код

@interface InfiniteScrollView : UIScrollView
@end;

@implementation InfiniteScrollView {
    bool _recentered;
}

- (void)layoutSubviews {
    [super layoutSubviews];
    [self recenterIfNecessary];
}

- (void)recenterIfNecessary {
    CGPoint currentOffset = [self contentOffset];
    CGFloat contentWidth = [self contentSize].width;
    CGFloat centerOffsetX = (contentWidth - [self bounds].size.width) / 2.0;
    CGFloat distanceFromCenter = fabs(currentOffset.x - centerOffsetX);
    
    if (distanceFromCenter < contentWidth / 4.0) {
        if (_recentered)
            _recentered = NO;
        return;
    }
    
    if (!_recentered) {
        _recentered = YES;
        
        // !
        NSLog(@"recenter");
        sleep(1);
    }
}
@end;

@interface ViewController : UIViewController
@end;

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    InfiniteScrollView * scrollView = [[InfiniteScrollView alloc] initWithFrame:[self viewBounds]];
    scrollView.contentSize = CGSizeMake([self viewBounds].size.width * 3, [self viewBounds].size.height);
    scrollView.contentOffset = CGPointMake([self viewBounds].size.width, 0);
    scrollView.pagingEnabled = YES;
    [self.view addSubview:scrollView];
    
    UIView *view1 = [[UIView alloc] initWithFrame:[self viewBounds]];
    view1.backgroundColor = [UIColor redColor];
    [scrollView addSubview:view1];
    
    UIView *view2 = [[UIView alloc] initWithFrame:CGRectOffset([self viewBounds], [self viewBounds].size.width, 0)];
    view2.backgroundColor = [UIColor greenColor];
    [scrollView addSubview:view2];
    
    UIView *view3 = [[UIView alloc]  initWithFrame:CGRectOffset([self viewBounds], [self viewBounds].size.width * 2, 0)];
    view3.backgroundColor = [UIColor blueColor];
    [scrollView addSubview:view3];
}

- (CGRect) viewBounds {
    CGRect bounds = [[UIScreen mainScreen] bounds]; // portrait bounds
    if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]))
        bounds.size = CGSizeMake(bounds.size.height, bounds.size.width);
    return bounds;
}

@end

Посмотрите на такую конструкцию. Есть три View, которые находятся на ScrollView. На некотором scrollView.contentOffset нужно подготовить новую View, что занимает немного времени.
Код

        // !
        NSLog(@"recenter");
        sleep(1);

Т.е. вместо sleep(1); я сознаю экземпляр класса, в котором много элементов UI. Выполняя это в главном потоке, ScrollView приостанавливается. А нужно, чтоб он продолжал скролиться и одновременно создавался объект с UI. Что можно сделать?

Это сообщение отредактировал(а) Shklyar - 1.4.2014, 12:12
--------------------
https://www.youtube.com/watch?v=JZN8Xaebs_U
PM WWW   Вверх
Bitter
Дата 1.4.2014, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



ну создание UI не может занимать много времени, может много времени занимает что-то другое? Например загрузка картинок или наполнение массивов
PM MAIL ICQ Skype   Вверх
Google
  Дата 21.2.2018, 22:17 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | iOS | Следующая тема »


 




[ Время генерации скрипта: 0.1017 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.