这是问题所在。
我有一个名为 -(void)searchingInBackground 的方法,它在后台运行(performSelectorInBackground)。
在这种方法中,我有几个不同的线程也在后台运行(performSelectorInBackground)。像这样:
-(void)searchingInBackground { @autoreleasepool { [self performSelectorInBackground:@selector(getDuplicatedPictures:) withObject:copyArray]; } @autoreleasepool { [self performSelectorInBackground:@selector(getLocationsOfPhotos:) withObject:copyArray]; } ... (and so on) }
在线程中的每个函数(即 getDuplicatedPictures、getLocationsOfPhotos...)中,它们将在最后生成 NSStrings,我将使用这些字符串来更新我的文本字段 GUI。
为了更新我的文本字段 GUI。我创建了一个名为 UpdateGUI 的函数,它将用来帮助我更新所有的 NSString。像这样,
-(void)UpdateUI { [_NumDupPhotosLabel(label for GUI) setStringValue: resultDupPhotos(string from thread function which is getDuplicatedPictures in this case)]; ....(includes all of my strings from threads) }
这是问题所在,当我在每个线程函数中使用 performSelectorOnMainThread 调用此 UpdateGUI 时。它会给我 EXC_BAD_ACCESS。这就是我所做的。例如:
-(void)getDupicatedPictures { resultDupPhotos = .....; [self performSelectorOnMainThread:@selector(UpdateUI) withObject:nil waitUntilDone:YES]; }
如果我不使用 performSelectorOnMainThread,只需直接在那些函数中设置值就可以了。我只是想更好地组织代码。
-(void)getDuplicatedPictures { resultDupPhotos = .....; [_NumDupPhotosLabel setStringValue: resultDupPhotos]; (works good and it will set the value to the GUI label) }
你们能告诉我如何解决这个问题吗?谢谢!!!