سؤال

أود استخدام nsconnection/nsDistributedObject للاتصال interprocess. أود أن يكون العميل قادرًا على التعامل مع الحالة التي يمكن الوصول فيها إلى الخادم أحيانًا فقط.

كيف يمكنني تحديد ما إذا كان إرسال رسالة إلى nsconnection سيفشل أم فشل؟ حاليًا في حالة وفاة الخادم الخاص بي (العملية التي تخلت عن الكائن البعيد) ، فإن العميل سوف يصطدم إذا أرسل محدد إلى الكائن البعيد.

من الناحية المثالية ، أود أن أحصل على غلاف للكائن البعيد الذي يمكنه إنشاء استئصال (أو إعادة) الاتصال ، وإرجاع القيمة الافتراضية في الحالة التي لا يمكن فيها إنشاء الاتصال ، أو فشل الاتصال. لا أعرف حقًا الطريقة الصحيحة للقيام بذلك باستخدام الهدف C.

إليك بعض الرمز الكاذب الذي يمثل هذا المنطق:

if myConnection is null:
    instantiate myConnection
    if MyConnection is null:
        return defaultValue

    try
        return [myConnection someMethod]
    catch
        myConnection = null
        return defaultValue
هل كانت مفيدة؟

المحلول

لسوء الحظ ، فإن الطريقة الوحيدة لاكتشاف فشل الاتصال هي استخدام معالج استثناء ، حيث لا توجد طريقة موثوقة "للطرح" على كائن بعيد إذا كان الاتصال لا يزال صالحًا. لحسن الحظ ، هذا بسيط:

//get the distributed object
id <YourDOProtocol> remoteObject = (id <YourDOProtocol>)[NSConnection rootProxyForConnectionWithRegisteredName:@"YourRegisteredName" host:yourHost];

//call a method on the distributed object
@try
{
    NSString* response = [remoteObject responseMethod];
    //do something with response
}
@catch(NSException* e)
{
    //the receiver is invalid, which occurs if the connection cannot be made
    //handle error here
}

نصائح أخرى

إذا كان الخادم الخاص بك يقيد بأمان ، فأنا من الفهم ، أنه سيتم نشر NSConnectionDidDieNotification مع إغلاق الاتصال حتى تتمكن من تسجيل عميلك مثل هذا:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(connectionDidDie:) name:NSConnectionDidDieNotification object:remoteObject];

ربما الخاص بك connectionDidDie:يمكن أن تقوم الطريقة بتعيين var منطقية يمكنك التحقق منها قبل محاولة إرسال الرسالة.

يمكن أن تنشر ما لديك إشعارًا للقول إنه قد بدأ (على الرغم من أنني أعتقد أن هناك أيضًا رسائل نظام لذلك ، لكنني بدأت للتو في التعرف على DO) ويمكنك التسجيل بالمثل لتكون إخطارًا على بدء التشغيل.

أعتقد أن إجابة روب هي "كل شيء" محدد ولن تحتاج إلى القلق بشأن مركز الإخطار الذي لم يصل إلى الخادم في الوقت المناسب.

لقد كنت أستخدم إخطار "DID DIE" في أول تطبيق لدي وآمل أن يساعدك.

تود.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top