سؤال

لدي اثنين من NSURLConnections.والثاني يعتمد على المحتوى من اول حتى التعامل مع البيانات الواردة من اتصال سوف تكون مختلفة عن اتصالين.

أنا مجرد التقاط الهدف-C و أود أن أعرف ما الطريقة الصحيحة لتنفيذ المندوبين.

الآن أنا باستخدام:

NSURL *url=[NSURL URLWithString:feedURL];
NSURLRequest *urlR=[[[NSURLRequest alloc] initWithURL:url] autorelease];
NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:urlR delegate:self];

أنا لا أريد أن مندوبا, كيف يمكنني تحديد اثنين من اتصالات مع مختلف المندوبين ؟

NSURLConnection *c1 = [[NSURLConnection alloc] initWithRequest:url delegate:handle1];
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:handle2];

كيف أقوم بإنشاء handle1 و handle2 مثل تطبيقات?أو واجهات?أنا لا أفهم كيف يمكنك أن تفعل هذا.

أي مساعدة من شأنها أن تكون رهيبة.

شكرا براين Gianforcaro

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

المحلول

في عينة الخاص بك، فإنك الوك كائن DownloadDelegate دون init'ing من أي وقت مضى.

    DownloadDelegate *dd = [DownloadDelegate alloc];

وهذا أمر خطير. بدلا من ذلك:

و

    DownloadDelegate *dd = [[DownloadDelegate alloc] init];

وأيضا، انها ليست <ط> بدقة الضروري أن يعلن طرق استجابة مندوب بك في إعلانinterface الخاص بك (على الرغم من أنه لن يضر، وبطبيعة الحال). وأخيرا، فأنت تريد أن تأكد من تنفيذ إتصال: didFailWithError: وconnectionDidFinishLoading: ل-release الكائن DownloadDelegate الخاص بك، وإلا فإنك سوف تسرب

وسعيد كنت وتشغيلها!

نصائح أخرى

بن, بينما كانت معلومات مفيدة لم كاملا الإجابة على سؤالي.

اكتشفت أخيرا كيفية إعداد بلدي المندوبين الذي كان ما كنت حقا طالبا.

أنا تنفيذه مثل ذلك:

@interface DownloadDelegate : NSObject 
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
@end

@implementation DownloadDelegate
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
}
@end

نحن نستخدم مندوب مثل ذلك:

DownloadDelegate *dd = [DownloadDelegate alloc];
NSURLConnection *c2 = [[NSURLConnection alloc] initWithRequest:url delegate:dd];

على أمل أن يساعد أي شخص في نفس الموقف و شكرا مرة أخرى بن من أجل مساعدتكم.

شكرا

براين Gianforcaro

أعتقد أن أفضل طريقة للتعامل مع اتصالات متعددة بطريقة نظيفة للحفاظ على مندوب واحد فقط تحديد كل NSURLConnection مع الوسم (إنه بسيط جدا جدا subclassing يمكنك أن تقرأ عن ونسخ من http://www.isignmeout.com/multiple-nsurlconnections-viewcontroller/ )

أساسا إلى الحرف الأول في كل NSURLConnection مع تحديد الوسم ثم يمكنك سحب هذا الوسم في تفويض باستخدام رمز التبديل-حالة التعامل معها وفقا لأي منطق تحتاج إليها.

التحديث

لقد تحولت ثم subclassed NSURLConnection في بسيط الفئة - أبسط قليلا و نظافة

https://github.com/Shein/Categories

تنفذ

والمندوبين ككائنات NSObject-نزل القياسية.

ويمكنك الإشارة كل من الاتصالات إلى نفس المندوب.

والمندوب يجب تنفيذ الطرق NSURLConnectionDelegate كنت ترغب في التقاط (مثل -اتصال: didReceiveData: و-connectionDidFinishLoading :). سوف الحصول على استدعاء هذه الأساليب من قبل مندوب حسب الاقتضاء.

وحاول صفي MultipleDownload على http://github.com/leonho/iphone- يبس / شجرة / سيد ، الذي يتعامل مع عدة كائنات NSURLConnection بالنسبة لك.

ومنذ تسمى المندوبين بشكل غير متزامن، فإنها يمكن أن نسميه didfinishloading في ترتيب عشوائي. يمكنك بعد ذلك استخدام الشيك الدولة لتحديد ما إذا كان يتم "الآخر" تحميل بعد قبل المتابعة.

وأنا استخدم 2 المندوبين:

وعلى سبيل المثال (وهذا هو زائف OC):

jsondelegate = [[JSonDelegate alloc]initWithCaller:self andSelector:@selector(jsonDone:)]
otherdelegate = [[OtherDelegate] initWithCaller:self andSelector:@selector(otherDone:)]

وعندما ينتهي كل مندوب ومندوبة بإعلام المتصل، عن طريق استدعاء أساليب عمله (2).

ويتلقى كل طريقة عمله البيانات رابط، وينقذ حالته إلى ايفار. ثم أنها تحقق لمعرفة ما إذا تم تعيين ايفار الآخرين، ومتابعة المعالجة إذا يتم القيام به على حد سواء.

if(self.jsonString && self.otherData){
  continueProcessing
}

وأمل أن يساعد هذا.

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