2014-10-27 2 views
1

У меня есть графический вид, который нарисован с использованием функции -(void)drawRect:(CGRect)rect, это немного сложная графика, которая включает дату в виде оси X и времени в виде оси Y. Поэтому каждый раз, когда я его рисую, для отображения окончательного графика всегда требуется 2,3 секунды. Красная точка может быть красной, зеленой или желтой, ее цвет зависит от данных, считываемых с базы данных. enter image description hereXcode - Как нарисовать вид с помощью потока?

Мой вопрос в том, что как нарисовать этот вид, используя многопоточность или в быстром режиме. Например, нарисуйте ось X и ось Y в одном потоке и нарисуйте графику каждого дня в отдельной нити (используя 30 потоков) или нарисуйте каждый час графики на 30 дней в отдельной ветке (используя 5 потоков)? Я попытался с помощью следующей функции:

for(int i = 0; i < 31; i++){ 
NSString *threadStr = [NSString stringWithFormat:@"%i", i]; 
dispatch_queue_t queue1 = dispatch_queue_create([threadStr UTF8String], NULL); 
dispatch_async(queue1, ^{ 
//Draw my graphics for one day 
..... 
}); 
} 

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

Я пытаюсь выяснить причину, по которой он задерживает 2, 3 секунды, если я рисую его с помощью основной нити. Это из-за чтения SQLite3 База данных?

Процедура составления этого графика является:

- (void)drawRect:(CGRect)rect 
{ 
    1.draw X axis with date label; 
    2.draw Y axis with time label; 
    NSArray *timeArray = @[@"08:00", 11:00", 14:00", 17:00", 20:00"]; 
    for(NSString *timeStr in timeArray){ 
     for(int i = 0; i < 31; i++){ 
     NSString *DateTimeStr = dateStr + timeStr; 
     int a = [DataManager getResult: DateTimeStr]; 
     UIColor *RoundColor; 
     if(a == 1){ 
     RoundColor = [UIColor colorWithRed:229/255.0 green:0/255.0 blue:145/255.0 alpha:1.0]; 
     } 
     else if(a == 2){ 
     RoundColor = [UIColor colorWithRed:0/255.0 green:164/255.0 blue:229/255.0 alpha:1.0]; 
     } 
     else if(a == 3){ 
     RoundColor = [UIColor colorWithRed:229/255.0 green:221/255.0 blue:0/255.0 alpha:colorAlpha];; 
     } 

     const CGFloat *components = CGColorGetComponents(RoundColor.CGColor); 
     CGContextSetRGBFillColor(context, components[0], components[1], components[2], components[3]); 
     CGContextFillEllipseInRect(context, CGRectMake(roundXnow,roundYnow,roundR,roundR)); 
     } 
    } 
} 

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

+0

Любые объекты пользовательского интерфейса должны быть нарисованы с использованием основного потока, а не отдельной нити. – Popeye

+0

ahhh, да, я это помню. Но есть ли способ сделать это быстрее и полнее? – Albert

+0

Создание и рисование объектов пользовательского интерфейса в отдельном потоке может создавать неизвестные проблемы, которые трудно отлаживать, также Apple заявляет, что все объекты пользовательского интерфейса должны быть созданы и нарисованы с использованием основного потока, и это все. Я не могу придумать ничего из головы, чтобы ускорить его, но это не значит, что я просто не могу думать об одном в данный момент. – Popeye

ответ

1

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

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

+0

жаль слишком поздно ... – Albert

Смежные вопросы