Frage

Ich versuche, ein einfaches Beispiel mit verteilten Objekten mit Pyobjc zu erstellen. Auf der Serverseite habe ich (in Xcode):

class VendedObject(NSObject):
    @objc.signature('@24@0:')
    def speak(self):
        return 'woof'

class TalkAppDelegate(NSObject):      

    def applicationDidFinishLaunching_(self, sender):
        NSLog("Application did finish launching.")
        conn = NSConnection.defaultConnection()
        NSLog("Creating connection")

        obj = VendedObject.alloc().init()
        print obj.description()
        conn.setRootObject_(obj)
        result = conn.registerName_("my_server")
        if not result:
            NSLog("Failed to register Name")
        #conn.setDelegate_(self)
        NSLog(conn.description())

Wenn ich es leite, bekomme ich:

2011-01-27 10:27:55.695 Talk[34432:a0f] Application did finish launching.
2011-01-27 10:27:55.698 Talk[34432:a0f] Creating connection
<VendedObject: 0x3e45970>
2011-01-27 10:27:55.701 Talk[34432:a0f] (** NSConnection 0x28f2030 receivePort <NSMachPort: 0x28f2160> sendPort <NSMachPort: 0x28f2160> refCount 2 **)

Auf der Kundenseite habe ich:

class ListenAppDelegate(NSObject):      

    def applicationDidFinishLaunching_(self, sender):
        NSLog("Application did finish launching.")
        proxy_obj = NSConnection.rootProxyForConnectionWithRegisteredName_host_(
            "my_server", None)
        if not proxy_obj:
            print 'Did not get an object from the server.'
        else:
            print proxy_obj.description()
            print proxy_obj.speak()

Ich bekomme:

2011-01-27 10:28:35.821 Listen[34460:a0f] Application did finish launching.
<VendedObject: 0x3e45970>
2011-01-27 10:28:35.829 Listen[34460:a0f] -[OC_PythonString initWithBytes:length:encoding:]: unrecognized selector sent to instance 0x3635130
2011-01-27 10:28:35.832 Listen[34460:a0f] -[OC_PythonString initWithBytes:length:encoding:]: unrecognized selector sent to instance 0x3635130

Mir fehlt etwas, weißt aber nicht was?

Bearbeiten: Geändert, um das zu verwenden, was ich für die richtige Signatur halte, und das neue Problem anzeigen, das auftritt. Vielen Dank.

War es hilfreich?

Lösung

Ich beantworte meine eigene Frage, sorry. Es scheint ein Problem mit Pyobjc zu sein. Ich habe den Server in Objective-C neu geschrieben:

#import "VendAppDelegate.h"

@interface VendedObject:NSObject {}
-(NSString *) speak;
@end

@implementation VendedObject

-(NSString *) speak {
    return @"woof";
}
@end

@implementation VendAppDelegate

@synthesize window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    NSAutoreleasePool *pool ;
    pool = [[NSAutoreleasePool alloc] init];
    VendedObject *obj;
    obj = [[[VendedObject alloc ] init] autorelease];
    NSLog(@"%@", [obj description]);

    NSConnection *conn;
    conn = [[[NSConnection alloc] init] autorelease];
    [conn setRootObject:obj];
    BOOL result;
    result = [conn registerName:@"my_server"];
    if (!result) {
        NSLog(@"Failed to register Name");
    }
    else {
        NSLog(@"%@", [conn description]);
    }
    [pool drain];
}

@end

Und führen Sie es mit dieser Ausgabe aus:

2011-01-27 11:45:14.252 Vend[36530:a0f] <VendedObject: 0x1001326f0>
2011-01-27 11:45:14.254 Vend[36530:a0f] (** NSConnection 0x1004527f0 receivePort <NSMachPort: 0x100452a80> sendPort <NSMachPort: 0x100452a80> refCount 1 **)

Ich mache das von Python:

from Foundation import *

proxy_obj = NSConnection.rootProxyForConnectionWithRegisteredName_host_(
    "my_server", None)
if not proxy_obj:
    print 'Did not get an object from the server.'
else:
    print proxy_obj.description()
    print type(proxy_obj)
    print proxy_obj.speak()

Ausgabe:

<VendedObject: 0x1001326f0>
<objective-c class NSDistantObject at 0x7fff70a64868>
woof
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top