Objective C - 在线程之间传递数据

时间:2014-05-12 10:08:58

标签: objective-c multithreading variables

所以我有一大块代码可以对查询做一些魔术,并给我一个名为JSONresult的变量,该变量已被告知在其自己的线程中运行。一旦得到这个结果,我想从该线程获取该变量并使其成为当调用IBAction方法时(按下按钮触发)如果变量JSONresult中的数据存在它会以NSTextView显示。

到目前为止,如果我在NSTextView方法中手动指定数据,但是尝试使用IBAction变量,我已经能够将数据显示在JSONresult中因为显而易见的原因而工作。

这是我到目前为止所做的。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    [NSThread detachNewThreadSelector:@selector(getJSONquery) toTarget:self withObject:nil];
}

-(void)getJSONquery {
    [[NSThread currentThread] setName:@"Get JSON Query"];

    //Some fancy stuff here

    NSArray *JSONresult = [string componentsSeparatedByString:@"<|...|>"];
}

完成所有这些后,我现在已经JSONresult我设置了IBAction,因此如果按下按钮,JSONresult将会被拍摄并显示在NSTextView

-(IBAction)showContent:(id)sender {
    [content setString:JSONresult];
}

我如何在两个线程/方法之间传递变量JSONresult

提前致谢! :)

另外如果我应该用头文件更新这篇文章,请告诉我。我是Objective C世界的新手,对一般的操作方法有很深的理解,所以我不知道它是否与这种情况有关

2 个答案:

答案 0 :(得分:2)

您并不真正在线程之间传递数据,因为所有线程都可以访问进程中的相同数据,但是您需要同步访问数据,以便多线程不会践踏共享数据,这可能导致其损坏。

在你的情况下,但是我不认为它们需要很多同步,因此你的问题不是关于在线程之间传递数据,而是更多地关注如何使按钮方法可以使用JSON结果。

正如@Leandros已经回答的那样,你通常会使用私人财产:

YourClass.m:

@interface YourClass ()
@property NSArray *jsonResult;     // Note: strong, atomic
@end

...

-(void)getJSONquery {
    [[NSThread currentThread] setName:@"Get JSON Query"];

    //Some fancy stuff here

    self.jsonResult = [string componentsSeparatedByString:@"<|...|>"];
}

答案 1 :(得分:1)

您可以创建一个属性。

// You can add this to the .h file.
@property (atomic, strong) NSArray *JSONresult;

// Or this above the @implementation in your .m file.
@interface YourClass()
@property (atomic, strong) NSArray *JSONresult;
@end

- (void)getJSONquery {
    [[NSThread currentThread] setName:@"Get JSON Query"];

    //Some fancy stuff here

    self.JSONresult = [string componentsSeparatedByString:@"<|...|>"];
}

- (IBAction)showContent:(id)sender {
    if (self.JSONresult) {
        [content setString:self.JSONresult];
    }
}