Паттерн, который может показаться вам полезным, - это выполнить проверку в верхней части функций, которые взаимодействуют с графическим интерфейсом, чтобы убедиться, что вы работаете в правильном потоке или нет, и при необходимости вызовите функцию. Например:
public delegate void InvocationDelegate();
public void DoGuiStuff(){
if (someControl.InvokeRequired){
someControl.Invoke(InvocationDelegate(DoGuiStuff));
return;
}
//GUI manipulation here
}
Используя этот шаблон - если вы находитесь в правильном потоке при вызове метода, он не вызывает себя, но если вы используете другой поток, он будет вызывать себя, а затем return (поэтому логика манипуляций с графическим интерфейсом называется только когда-либо в любом случае).
NSDate *curDate = [NSDate date];
NSCalendar *currentCalendar = [NSCalendar currentCalendar];
NSRange daysRange = [[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth
forDate:curDate];
NSDateComponents* comps = [currentCalendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:curDate];
[comps setDay:daysRange.length];
NSDate *maximumDate = [[NSCalendar currentCalendar] dateFromComponents:comps];
Workaround Function:
-(int)GetLastDayOfMonth:(NSDate *)date
{
int last_day = 27;
NSCalendar *cal=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *compsMonth = [cal components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:date];
[compsMonth setDay:last_day];
int month = [compsMonth month];
while(TRUE){
[compsMonth setDay:last_day+1];
NSDate *dateFuture = [cal dateFromComponents:compsMonth];
NSDateComponents *futureComps = [cal components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:dateFuture];
if(month != [futureComps month]){
return last_day;
}
last_day+=1;
}
return last_day;
}