Ios 使用NSTimer暂停后台线程执行,但运行不正常

Ios 使用NSTimer暂停后台线程执行,但运行不正常,ios,objective-c,Ios,Objective C,我想通过在后台运行的用户操作暂停线程操作。我使用NSTimer暂停线程,但当我按下暂停按钮时,我的程序(屏幕)全部冻结,我无法按下任何按钮 NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:

我想通过在后台运行的用户操作暂停线程操作。我使用
NSTimer
暂停线程,但当我按下暂停按钮时,我的程序(屏幕)全部冻结,我无法按下任何按钮

NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval:1 
                                                  target:self 
                                                selector:@selector(calculationOfPIValue) 
                                                userInfo:nil 
                                                 repeats:YES];

我不确定我是否正确理解了你想做什么

您有一个后台线程(通过
NSThread
NSOperation
GCD
?)运行它)

因此,要在后台运行PI计算并启用取消它,您可以使用
NSOperation

因此,您创建了一个名为
MyPiCalculationOperation
的新类,并键入:

#import <Foundation/Foundation.h>
@interface MyPiCalculationOperation: NSOperation
@end

@implementation MyPiCalculationOperation
- (void)main {
    @autoreleasepool {
        // paste your calculate PI algorithm, I put here any loop as an example
        for (int i = 0; i < 100; i++) {
            // in your loop check isCancelled flag
            if (self.isCancelled) {
                break;
            }
        }
    }
}
@end

我不确定我是否正确理解了你想做什么

您有一个后台线程(通过
NSThread
NSOperation
GCD
?)运行它)

因此,要在后台运行PI计算并启用取消它,您可以使用
NSOperation

因此,您创建了一个名为
MyPiCalculationOperation
的新类,并键入:

#import <Foundation/Foundation.h>
@interface MyPiCalculationOperation: NSOperation
@end

@implementation MyPiCalculationOperation
- (void)main {
    @autoreleasepool {
        // paste your calculate PI algorithm, I put here any loop as an example
        for (int i = 0; i < 100; i++) {
            // in your loop check isCancelled flag
            if (self.isCancelled) {
                break;
            }
        }
    }
}
@end

暂停也可以像取消一样思考。我可以通过用户的操作停止线程。问题在于通过用户的操作(按钮)暂停线程并将其从停止点释放。你能告诉我怎么做吗?问题是通过用户的操作(按钮)暂停线程。你能描述一下你的意思吗?因为对我来说,这意味着在按下按钮的动作中,你想暂停线程吗?你的线是怎么做的?是的。我想通过按下按钮暂停线程,当用户再次按下按钮时,它应该从用户停止的点开始运行,而不是从开始运行。暂停也可以像取消一样执行相同的操作。我可以通过用户的操作停止线程。问题在于通过用户的操作(按钮)暂停线程并将其从停止点释放。你能告诉我怎么做吗?问题是通过用户的操作(按钮)暂停线程。你能描述一下你的意思吗?因为对我来说,这意味着在按下按钮的动作中,你想暂停线程吗?你的线是怎么做的?是的。我想通过按下按钮来暂停线程,当用户再次按下按钮时,它应该从用户停止的点开始运行,而不是从开始运行。您的计算值实际上是做什么的?它是否只计算第10位的PI?或者它计算到第1000位?它计算100位当NSTimer启动并调用您的方法时,它不会在后台线程上执行。如果你想让它在后台线程上运行,你需要以下面的@Vive answer为例。你的CalculationOffivalue实际上是做什么的?它是否只计算第10位的PI?或者它计算到第1000位?它计算100位当NSTimer启动并调用您的方法时,它不会在后台线程上执行。如果您希望它在后台线程上运行,您需要查看下面的@Vive answer作为示例。