سؤال

لذلك أنا أستخدم عينات Apple Picturesharing/PictureingBrowser لإرسال وتلقي البيانات. يستخدم هذا nsfilehandle على جانب الخادم لإرسال صورة باستخدام طريقة nsfilehandle's writedata.

NSFileHandle * incomingConnection = [[aNotification userInfo] objectForKey:NSFileHandleNotificationFileHandleItem];

[[aNotification object] acceptConnectionInBackgroundAndNotify];
[incomingConnection writeData:dataToWrite];
[incomingConnection closeFile];

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

أظن أن بعض حالات الجمود يحدث في مكان ما ، لكنني لست متأكدًا من أين. حاولت البحث عن ANYNC. طريقة كتابة بيانات تشاك من قبل تشاك مع NSFileHandle ، لكنني لم أتمكن من العثور على مثل هذه الطريقة.

أي إرشادات ستساعد!

هل كانت مفيدة؟

المحلول

فاتني خطوة واحدة أساسًا ... في NSNetServiceBrowser's NetServiceBrowser: didfindservice :( Morecoming: طريقة تفويض ، بدلاً من محاولة الاتصال بكل خدمة واردة ، بدلاً من ذلك (كما يقول المستند :)) الاحتفاظ بالخدمة ، وتعيين المندوب لتلك الخدمة التي تم العثور عليها ، ومحاولة حل الخدمة.

أتمكن بعد ذلك من فتح دفق للخدمة التي تم حلها في *- (void) netservededidresolveaddress: (nsnetservice )مرسل وهو طريقة مندوب NSNetService.

- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing {
    [aNetService retain];
    [aNetService setDelegate:self];
    [aNetService resolveWithTimeout:5.0];

}

- (void)netServiceDidResolveAddress:(NSNetService *)service{

    NSInputStream * istream;
    [sender getInputStream:&istream outputStream:nil];
    [istream retain];
    [istream setDelegate:self];
    [istream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [istream open];

    [service release];
}

//... NSStreamDelegate method to retrieve the data via the stream.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top