Multithreading 核心数据和分布式对象

Multithreading 核心数据和分布式对象,multithreading,cocoa,core-data,Multithreading,Cocoa,Core Data,亲爱的社区。 我尝试使用核心数据发布多用户。我使用的是一个客户机-服务器的bonjour连接。它现在是如何工作的: 服务器部件: - (void)startBroadcasting; { receiveSocket = [[NSSocketPort alloc] init]; int receivePort = [self portFromSocket:receiveSocket]; NSLog(@"NETWORK: port is %d",receivePort); myConnection

亲爱的社区。 我尝试使用核心数据发布多用户。我使用的是一个客户机-服务器的bonjour连接。它现在是如何工作的: 服务器部件:

- (void)startBroadcasting;
{
receiveSocket = [[NSSocketPort alloc] init];
int receivePort = [self portFromSocket:receiveSocket];
NSLog(@"NETWORK: port is %d",receivePort);
myConnection = [[NSConnection alloc] initWithReceivePort:receiveSocket
                                                sendPort:nil];
[myConnection setRootObject:self];

myService = [[NSNetService alloc] initWithDomain:kDomainName 
                                            type:kServiceName 
                                            name:kServerName
                                            port:receivePort];
[myService setDelegate:self];
[myService publish];
}

- (byref NSArray*)allObjects
{
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Carrier" 
                                          inManagedObjectContext:context];
[request setEntity:entity];
[request setIncludesSubentities:YES];

NSError *error = nil;
NSArray *objects = [context executeFetchRequest:request error:&error];
[request release], request = nil;

if (error) {
    NSLog(@"%@:%@ error: %@", [self class], NSStringFromSelector(_cmd), error);
    return nil;
}
return objects;
}
客户部分:

- (void)netServiceDidResolveAddress:(NSNetService*)service
{
NSLog(@"%@:%@ netServiceDidResolveAddress find something\n", [self class], NSStringFromSelector(_cmd));

NSConnection *clientConnection = nil;
NSSocketPort *socket = nil;
//NSData *address = [[service addresses] lastObject];
//u_char family = ((struct sockaddr*)[address bytes])->sa_family;
//socket = [[NSSocketPort alloc] initRemoteWithProtocolFamily:family 
//                                                 socketType:SOCK_STREAM 
//                                                   protocol:IPPROTO_TCP 
//                                                    address:address];
socket = [[NSSocketPort alloc] initRemoteWithTCPPort:[service port]
                                                host:[service hostName]];
clientConnection = [NSConnection connectionWithReceivePort:nil 
                                                  sendPort:socket];
[clientConnection enableMultipleThreads];
[self setServer:[clientConnection rootProxy]];

[socket release], socket = nil;
[service stop];
[service release];
// testing connection:
[server ping];
NSArray *allObjects = [server allObjects];
[carriersArrayVisible setContent:allObjects];

}
实体载体是我的树对象的头部。 数据库大小为220M。 一切正常,但我不能用那种方式,因为: 1.当我在服务器上进行更新时,我会删除一些“Carrier”对象,以及这个案例产品

CoreData无法实现的故障

尝试在客户端按列对数组排序时出错

  • 这种方式在加载数据时会导致服务器和客户端用户界面的大量冻结。我明白,我可以把一个进度加载,但我不明白我怎么能知道一个数据进度发送,这是工作在幕后,因为我看到。网络连接是完美的,在运行客户端和服务器的本地计算机上,我有相同的效果

  • 我曾多次尝试为客户端计算机同步我的managedobjectcontext(可能这是一种更好的方法),但我有一些观点,我不明白: a) 如何从外部主运行中心复制到本地主运行中心 b) 我可以在服务器上创建本地moc的其他副本以供远程客户端使用吗?尝试创建moc并附加到现有持久存储失败,moc为空


  • 也许有人可以分享经验或推荐一个好的例子?

    我只是第一次尝试了解核心数据。我不确定这与我刚才读到的有关。数据存储的数据文件通常存储在xml类型的文件中,核心数据必须加载整个文件。但您可以将其更改为SQLite类型的数据库,该数据库只加载当时需要的内容。因此速度更快。在使用SQLite时有一些大的注意事项,特别是当您已经设置好东西时。(在本初学者示例的第22页)我有sql类型的XML,当然,XML在大型数据库中不能很好地工作。我的解决方案是——更改应用程序的设计并避免删除。托管对象上下文中的所有新对象都包含所有数据,这是我最初创建设计应用程序时不理解的。