إرسال كميات كبيرة من البيانات مع nsfilehandle
-
01-10-2019 - |
سؤال
لذلك أنا أستخدم عينات 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.