그래서 타이머가있는보기 컨트롤러가 있습니다. 하나의 단추가 있습니다. 처음으로보기가로드되면 버튼에 "시작"이라고 표시되어야합니다. 이 탭되면선택기를 호출하지 않고 스레드를 분리하거나 최소한 해결 방법을 만들 수 있습니까?
, "시작"-> "일시 중지"를.
다른 탭 "일시 중지"-> "재개".
"다시 시작"-> "일시 중지"를 누릅니다. 내가 타이머가 정확 원하기 때문에
, 나는 (내가 몇 가지 설명을 부탁드립니다 내가 올바른 방법을 선택했다 생각) 메인 스레드에서 분리 된. 하지만 스레드에서 분리하는 것처럼 실제로 시작 단추 대신 "일시 중지"시작 단추를 만드는 메서드를 호출하는 것 같습니다. 이 문제를 어떻게 해결할 수 있습니까? testTask.showButtonValue의 방법으로
, 기본값 (과 부하) 즉시 호출 Afer 즉, 새 스레드를 생성하고 선택 언급 수행detachNewThreadSelector
를 호출 1.
- (void)viewDidLoad {
[super viewDidLoad];
[NSThread detachNewThreadSelector:@selector(startTimer:) toTarget:self withObject:nil];
if (testTask.showButtonValue == 1) {
[startButton setTitle:@"Start" forState:UIControlStateNormal];
} else if (testTask.showButtonValue == 2) {
[startButton setTitle:@"Pause" forState:UIControlStateNormal];
} else if (testTask.showButtonValue == 3){
[startButton setTitle:@"Resume" forState:UIControlStateNormal];
}
}
-(IBAction)startTimer:(id)sender{
if (testTask.showButtonValue == 1) {
[startButton setTitle:@"Pause" forState:UIControlStateNormal];
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
testTask.showButtonValue = 2;
} else if (testTask.showButtonValue == 2) {
[startButton setTitle:@"Resume" forState:UIControlStateNormal];
[timer invalidate];
timer = nil;
testTask.showButtonValue = 3;
} else if (testTask.showButtonValue == 3){
[startButton setTitle:@"Pause" forState:UIControlStateNormal];
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
testTask.showButtonValue = 2;
}
}
-(void)timerAction:(NSTimer *)t
{
if(testTask.timeInterval == 0)
{
if (self.timer)
{
[self timerExpired];
[self.timer invalidate];
self.timer = nil;
}
}
else
{
testTask.timeInterval--;
}
NSUInteger seconds = (NSUInteger)round(testTask.timeInterval);
NSString *string = [NSString stringWithFormat:@"%02u:%02u:%02u",
seconds/3600, (seconds/60) % 60, seconds % 60];
timerLabel.text = string;
NSLog(@"%f", testTask.timeInterval);
}
문제는 우리가 core Data에 저장되어 timeInterval을 저장해야하기 때문에 지금하고있는 일 대신 카운트 다운 타이머를 설정하기 위해 testTask.timeInterval 속성을 사용해야한다는 것입니다. 어떻게 추가 할 수 있습니까? – EvilAegis
또한 "버튼의 제목을"시작 "으로 변경할 필요가 없으며"일시 중지 "또는"다시 시작 "중 하나입니다. 뷰가 처음으로로드되면 시작이어야합니다 : O. – EvilAegis
마지막으로, "타이머가 0.01 초마다 발사되도록 예정되어 있으며, 0.1 초로 정확할 것으로 기대됩니다." 이로 인해 많은 메모리가 사용됩니까? – EvilAegis