OS X: كيفية مشاهدة مقبس الأحداث مع nsrunloop؟
-
20-09-2019 - |
سؤال
أنا أكتب تطبيق الكاكاو. يوجد مقبس في التطبيق ، وكلما أصبح المقبس قابل للقراءة ، أريد قراءة البيانات من المقبس ، ومعالجة البيانات ، وتحديث واجهة المستخدم وفقًا لذلك. أرغب في دمج فحص الحدث القراءة في الحلقة الرئيسية ، أي أريد إرفاق المقبس بالحلقة الرئيسية وأمر الحلقة الرئيسية باستدعاء رد الاتصال كلما أصبح المقبس قابلاً للقراءة.
لقد كتبت تطبيق اختبار ، لكن لسبب ما لا يعمل:
#include <stdio.h>
#include <Foundation/NSAutoReleasePool.h>
#include <Foundation/NSRunLoop.h>
#include <Foundation/NSPort.h>
@interface MyDelegate : NSObject <NSPortDelegate> {
}
- (void)handlePortMessage:(NSPortMessage *)portMessage;
@end
@implementation MyDelegate
- (void)handlePortMessage:(NSPortMessage *)portMessage {
printf("Haiz\n");
}
@end
int
main() {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSSocketPort *server = [NSSocketPort alloc];
MyDelegate *foo = [MyDelegate alloc];
[server initWithTCPPort: 1234];
[server setDelegate: foo];
[[NSRunLoop mainRunLoop] addPort: server forMode: NSDefaultRunLoopMode];
[[NSRunLoop mainRunLoop] run];
[pool release];
return 0;
}
من المفترض أن يستمع التطبيق على منفذ المضيف المحلي 1234 ، وكلما يتصل شخص ما بالخادم أو يرسل البيانات إلى الخادم ، من المفترض أن يقوم التطبيق بطباعة "Haiz" على وحدة التحكم. لكن التطبيق لا يفعل شيئًا على الإطلاق. يتم إنشاء المقبس ويمكنني telnet إلى المنفذ 1234 ، لكن التطبيق لا يطبع أي شيء إلى وحدة التحكم.
ما الخطأ الذي افعله؟
المحلول
من الوثائق:
يمكن استخدام كائن NSSocketPort كنقطة نهاية لاتصالات الكائن الموزعة.
هذا ليس ما تفعله هنا.
انت تريد أيضاً nsfilehandle حول واصف ملف المقبس من API BSD Sockets ، أو أ CFSocket. سيتيح لك ذلك وضع المقبس على حلقة التشغيل.
نصائح أخرى
تريد استخدامها NSSocketPort
في الطريقة التي تفعله ، ولكن بعد ذلك ، قم بإنشاء ملف NSFileHandle
لقبول الاتصالات على المقبس. يمكنك الحصول على عمليات الاسترجاعات على الخيط الرئيسي تمامًا كما تتوقع ، أولاً للاتصالات الجديدة ، ثم للحصول على بيانات عن تلك الاتصالات. استخدم هذا مقال أورايلي وتجاهل الأشياء HTTP.