gpt4 book ai didi

objective-c - 通过 NSConnection 同步分布式对象问题

转载 作者:行者123 更新时间:2023-12-03 17:17:58 25 4
gpt4 key购买 nike

我有一个应用程序,可以从网络中提取数据,解析它们,然后在搜索界面中编译结果。由于数据不相互依赖,因此对应用程序进行多线程以同时执行多个获取和解析是有意义的。我在我编写的搜索和解析对象上使用 NSInitationOperation 来执行此函数。

在 Controller 对象中,我有以下方法:

-(void) searchAndParseAsynchronously { 
NSPort *serverPort = [NSMachPort port];
NSConnection *serverConnection = [NSConnection connectionWithReceivePort:serverPort sendPort:serverPort];
[serverConnection setRootObject:self];
for (NSURL *urlToProcess in self.urlsToFetch)
{
BaseSearchParser *searcherForURL = [BaseSearchParser newSearchParserWithParameters:self.searchParams];
searcherForURL.urlToDocument = urlToDocument;

SearchThreader *searchThreader = [SearchThreader new];
searchThreader.threadConnection = comConnection;
searchThreader.targetSchema = searcherForURL;
NSInvocationOperation *threaderOperation = [[NSInvocationOperation alloc] initWithTarget:searchThreader
selector:@selector(executeSearchParse)
object:nil];
[self.operationQueue addOperation:threaderOperation];
}
}

该应用程序依赖于核心数据,我收集到的核心数据大多是线程不安全的。我为每个搜索/解析操作(以及 Controller )都有一个不同的 NSManagedObjectContext,并且仅在操作或代理对象之间传递 NSManagedObjectId。

这些操作通过 NSConnection 对象将完成的解析结果传达回其 Controller 。 Controller 使用 NSMachPort 对象构造 NSConnection,将其自身设置为根对象,并将相同的 NSConnection 对象提供给 NSInitationOperations 的每个目标。然后, Controller 将 NSInitationOperation 排入队列,以便在其自己的 NSOperationQueue 中执行。

在搜索线程对象中,我有以下方法:

-(void) executeSearchAndParse
{
id parentServer = [threadConnection rootProxy];
[parentServer setProtocolForProxy:@protocol(SearchParseProtocol)];

NSArray *importResults = [targetSchema generatedDataSetIds];

[parentServer schemaFinished:targetSchema];
[parentServer addSearchResults:importResults];
}

我相信我已经遵循了 Apple 的通用线程间通信示例 here .

我不得不说,大多数时候,这工作得很好:来自 NSConnection rootProxy 的通知按预期发布到主线程中的运行循环,并等待拾取,直到 Controller 对象准备好。然而,在我的一些测试用例中,它会导致 Core Data 突然停止,因为有时消息会在与调用 rootProxy 对象的 NSInitationOperation 对象相同的线程中到达 Controller 对象。

我在 Controller 中的搜索/解析操作完成时发送的消息上放置了一个调试器点,果然,有时(只是有时)执行线程不是主要一.有谁知道为什么会发生这种情况?或者,有没有更简单的方法来构造线程间异步通信?或者我的核心数据方法是否完全不正常?

提前致谢!

最佳答案

我没有发现您的方法有任何问题,并且之前以类似的方式使用过 NSConnection 。我唯一看到的是我只是使用了 NSPort 而不是显式使用 NSMachPort

Or, is there a simpler way to construct inter-thread asynchronous communication?

我认为 Apple 不再提倡使用分布式对象进行线程间通信。 IIRC 这个猜测主要基于我所看到的文档,这些文档确实促进了线程间通信的 DO,但后来已被删除或编辑。

我还认为 NSObject 上与线程相关的 PerformSelector: 方法更容易使用:

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait

(而第二个仅从 10.5 起可用)。

关于objective-c - 通过 NSConnection 同步分布式对象问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1887687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com