所以我有一大块代码可以对查询做一些魔术,并给我一个名为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世界的新手,对一般的操作方法有很深的理解,所以我不知道它是否与这种情况有关
答案 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];
}
}