2011-12-15 11 views
2

私は関数FSMoveObjectToTrashSyncを使用するアプリケーションを持っています。これはバックグラウンドスレッドで動作します。私は、私のアプリの能力が必要です、それを一時停止するためにボタンをクリックするか、(一時停止した場合は)どうすればそれを作ることができますか?コードの 例:NSThreadを一時停止/継続する方法

NSMutableArray *fileArray = [NSMutableArray array withobjects:@"file1url", @"file2", @"file3", nil]; 
NSMutableArray *threadArray = [[NSMutableArray alloc] init]; 

-(void)myFunc{ 
    for (NSURL *url in fileArray){ 
     NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(mySelectorWith:) object:url]; 
     [thread start]; 
     [threadArray addObject:thread]; 
    } 
} 

-(void)mySelectorWith:(NSURL *) url{ 
     FSRef source; 
     FSPathMakeRef((const UInt8 *)[[url path] fileSystemRepresentation], &source, NULL); 
     FSMoveObjectToTrashSync(&source, NULL, kFSFileOperationDefaultOptions); 
} 

PS:私の英語のため申し訳ありませんが、私はベラルーシから来たんだ... =(

答えて

2

1つの解決策は、単一スレッドのforループをNSOperationサブクラスで置き換えることです。各操作は、厳密に1つのオブジェクトをゴミ箱に入れてください。ゴミ箱に入れたいオブジェクトごとに1つの操作を作成し、すべての操作をNSOperationQueueに入れます。

操作キューはスレッドごとに各操作を実行し、複数のスレッドで複数の操作を実行することもできます。

An operation queue can be paused and resumed at will;キューをサスペンドすると、すでに実行中のキュー内の操作はすべて終了しますが、キューを再開するまではそれ以上の操作は開始されません。

2

あなたはNSConditionLockを使用することができますアンNSConditionLockが条件変数に似ていることがあります。。 lockWhenConditionとlockWithConditionの2つの基本的なメソッドとロックを使用しています。典型的な使い方は、バックグラウンドスレッドが "lockWhenCondition:"で条件ロックを待つこと、そしてフォアグラウンドスレッドがバックグラウンドスレッドを引き起こす条件を設定することです条件は単純な整数で、通常は列挙型です。

ここにあります例:この例では

enum { 
    kWorkTodo = 1, 
    kNoWorkTodo = 0 
} 

- (id)init { 
    if ((self = [super init])) { 
     theConditionLock = [[NSConditionLock alloc] initWithCondition: kNoWorkTodo]; 
     workItems = [[NSMutableArray alloc] init]; 
    } 
} 

- (void)startDoingWork { 
    [NSThread detachNewThreadSelector:@selector(doBackgroundWork) toTarget:self withObject:nil]; 
} 

- (void)doBackgroundWork:(id)arg { 
    while (YES) { 
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
     NSArray *items = nil; 
     [theConditionLock lockWhenCondition:kWorkTodo]; // Wait until there is work to do 
     items = [NSArray arrayWithArray:workItems] 
     [workItems removeAllObjects]; 
     [theConditionLock unlockWithCondition:kNoWorkTodo]; 
     for(id item in items) { 
      // Do some work on item. 
     } 
     [pool drain]; 
    } 
} 

- (void)notifyBackgroundThreadAboutNewWork { 
    [theConditionLock lock]; 
    [workItems addObject:/* some unit of work */]; 
    [theConditionLock unlockWithCondition:kWorkTodo]; 
} 

、startDoingWorkがdoBackgroundWorkと呼ばれる:バックグラウンドスレッドで開始しますが、実行するすべての作業がないため、その後停止します。 notifyBackgroundThreadAboutNewWorkが呼び出されると、doBackgroundWork:は新しい仕事を起動して処理し、次に新しい仕事が利用可能になるのを待ってスリープ状態に戻り、次回notifyBackgroundThreadAboutNewWorkが呼び出されたときに実行されます。

関連する問題