2016-04-09 5 views
0

オブジェクトを持つ新しいスレッドに(NSString *)を渡したいと思います。 私は、バックグラウンドスレッドで、メインスレッドでそれを変更できるように、私はこのNSString *パラメータを新しいスレッドwithobjectに渡す方法

//this method will create a thread for sleepAndAssign ,and i want to pass the param type is NSString * . the background thread is to change the param's value. 
NSString *param = @"0"; 
[self performSelectorInBackground:@selector(sleepAndAssign:) withObject:param]; 
NSLog(@"param = %@", param); 
[NSThread sleepForTimeInterval:4]; 
NSLog(@"param = %@", param); 
... 

- (void)sleepAndAssign:(NSString *)param { 
    [NSThread sleepForTimeInterval:1]; 
    NSDate *date = [NSDate dateWithTimeIntervalSinceNow:2]; 
    [NSThread sleepUntilDate:date]; 
    param = @"5"; 
    NSLog(@"backgroundthread param = %@", param); 
} 

のように変更 にコードを取得することができ、結果の出力は、私はのparamの変更を受け取ることができますどのように

param = 0 
backgroundthread param = 5 
param = 0 

ですバックグラウンドスレッドで行うのですか? 私は知っているこれを行うにはの参照キーワードがあります。

私は私がこの問題を解決できるメソッドのポインタのアドレスを渡すことができますが、スレッドは、idタイプになる必要があることを渡す必要があります、私はメソッドにparamのアドレスを渡すことはできません。どうすればいいですか?

答えて

0

別のスレッドではrefとは動作しません。

最も簡単な解決策はラッパーオブジェクトを使用している:私はそれが最も簡単な解決策だと言う

@interface MyData : NSObject 

@property (atomic, strong, readwrite) NSString *param; 
@end 

@implementation MyData 
@end 

...

MyData *data = [[MyData alloc] init]; 
data.param = @"0"; 
[self performSelectorInBackground:@selector(sleepAndAssign:) withObject:data]; 
NSLog(@"param = %@", data.param); 
[NSThread sleepForTimeInterval:4]; 
NSLog(@"param = %@", data.param); 
... 

- (void)sleepAndAssign:(MyData *)data { 
    [NSThread sleepForTimeInterval:1]; 
    NSDate *date = [NSDate dateWithTimeIntervalSinceNow:2]; 
    [NSThread sleepUntilDate:date]; 
    data.param = @"5"; 
    NSLog(@"backgroundthread param = %@", data.param); 
} 

注意、それははるかに最善の解決策からです。まず、新しいスレッドを開始する代わりにディスパッチキューを使用し、呼び出し元とデータを共有するのではなく、コールバックブロックを使用して戻す必要があります。

+0

ありがとう、私はそれを得た最も簡単な解決策。私は単純な環境でこれを使っています。だから私は問題を解決するためにラッパーオブジェクトを作成したくない。 NSString、NSNumberなどの基本的な型を使用できる他のソリューションがありますか? – lamb

+0

@lambスレッドとセレクタ(メソッド)を使用せず、キューとブロックを使用します。 – Sulthan

+0

ok ...これはもっと良い解決策だと思います – lamb

関連する問題