3

我想使用一个NSOperationQueue里面有一个计时器的。例如 - 我下载 1 个元素(完成第一个NSOperation)然后我想等待 3 秒,然后编译器继续进行下一个操作。第二次NSOperation完成后,我希望它等待同样的 3 秒,然后开始第 3 次操作。

如何实现这种行为?我以前没有使用NSTimeror的经验,NSRunLoop我不确定是否应该使用它们。

提前致谢。

4

3 回答 3

4

只要操作在后台线程中执行;

您可以将 maxConcurrentOperationCount 设置为 1 并在您的操作块中使用 sleep(3) 3 秒。

于 2012-12-13T15:18:02.273 回答
1

采用sleep(int secondsToSleep);

于 2012-12-13T15:17:07.170 回答
0

如果您只想在操作完成某些操作后等待 3 秒,则只需使用 sleep 和 maxConcurrentOperationCount 即可。

如果您需要更复杂的东西,您可以在 while 循环中使用 timeIntervalSinceDate。如果您的操作执行一些可能需要不确定时间的处理(在我的情况下,我需要运行远程创建帐户过程)并且您希望在运行下一个操作之前等待至少或最多 X 秒,这将非常有用队列。您可以使后续的 NSOperations 依赖于先前操作的完成。

使用 addDependency 对 NSOperation 进行排序以等待上一个操作完成:

NSOperationQueue *ftfQueue = [NSOperationQueue new];
// Does this user have an account?
// createFTFAccount is subclass of NSOperation.  
FTFCreateAccount *createFTFAccount = [[FTFCreateAccount alloc]init];
[createFTFAccount setUserid:@"a-user-id"];
[ftfQueue addOperation:createFTFAccount];
// postFTFRoute subclass NSOperation    
FTFPostRoute *postFTFRoute = [[FTFPostRoute alloc]init];
// Add postFTFRoute with a dependency on Account Creation having finished 
[postFTFRoute addDependency:createFTFAccount];
[ftfQueue addOperation:postFTFRoute];

在 NSOperation 子类主要检查操作是否已完成或是否花费太长时间

#import <Foundation/Foundation.h>
@interface FTFCreateAccount : NSOperation
    @property (strong,nonatomic) NSString *userid;
@end    



@implementation FTFCreateAccount
{
    NSString *_accountCreationStatus;
}

- (void)main {

    NSDate *startDate = [[NSDate alloc] init];
    float timeElapsed;
    ..... 
    .....
    .....

    // Hold it here until a reply comes back from the account creation process 
    // Or the process is taking too long
    while ((!_accountCreationStatus) && (timeElapsed < 3.0)) {
        NSDate *currentDate = [[NSDate alloc] init];            
        timeElapsed = [currentDate timeIntervalSinceDate:startDate];
    }
    // Code here to do something dependent on _accountCreationStatus value

}
于 2013-12-30T11:33:56.483 回答