У меня есть графический вид, который нарисован с использованием функции -(void)drawRect:(CGRect)rect
, это немного сложная графика, которая включает дату в виде оси X и времени в виде оси Y. Поэтому каждый раз, когда я его рисую, для отображения окончательного графика всегда требуется 2,3 секунды. Красная точка может быть красной, зеленой или желтой, ее цвет зависит от данных, считываемых с базы данных. Xcode - Как нарисовать вид с помощью потока?
Мой вопрос в том, что как нарисовать этот вид, используя многопоточность или в быстром режиме. Например, нарисуйте ось 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, потому что я знаю, что есть много записей в базе моих данных ,
Любые объекты пользовательского интерфейса должны быть нарисованы с использованием основного потока, а не отдельной нити. – Popeye
ahhh, да, я это помню. Но есть ли способ сделать это быстрее и полнее? – Albert
Создание и рисование объектов пользовательского интерфейса в отдельном потоке может создавать неизвестные проблемы, которые трудно отлаживать, также Apple заявляет, что все объекты пользовательского интерфейса должны быть созданы и нарисованы с использованием основного потока, и это все. Я не могу придумать ничего из головы, чтобы ускорить его, но это не значит, что я просто не могу думать об одном в данный момент. – Popeye