سؤال

أجد نفسي أستخدم مزيجا من Vars Global Vars و NSrunloop لإجبار المزامنة عبر تطبيقي. على الرغم من أنه يعمل، إلا أنه يبدو قليلا قبيح لي. هل هناك أي طريقة أخرى لتحقيق نفس النتيجة؟

إليك مثال عادة:

ParkingSpots *parkingSpots = [[[ParkingSpots alloc] initWithMapViewController:self] autorelease];
        keepRunning = YES;
        NSRunLoop *theRL = [NSRunLoop currentRunLoop];
        while (keepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);

        UpdateLocation *updatedLocation = [[[UpdateLocation alloc] initWithUserid:@"me" andCoordinate:annotation.coordinate withMapViewController:self]
                                           autorelease];
        NSLog(@"Lat = %f, Long = %f",annotation.coordinate.latitude,annotation.coordinate.longitude);
        [updatedLocation sendUpdate];

في هذا الرمز، أحتاج إلى الانتظار حتى تتم تهيئة كائن ParkingSPots بالكامل قبل تهيئة UpdateLocation. نظرا لأن UpdateLocation تتوقع أن يتم تهيئة ParkingsPots بالكامل، دون التوبيخ Runloop المحامين بشكل صحيح. مع Runloop كل شيء يعمل كما هو متوقع.

ومع ذلك يبدو هذا قبيحا للغاية بالنسبة لي (إعداد Var عالمي في نقاط مختلفة في التعليمات البرمجية الخاصة بي). هل هناك حل أكثر أناقة؟ شكرا مقدما لمساعدتكم!

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

المحلول

يمكنك استخدام نمط المفوض على ParkingSpots فئة، واتصل بالمندون عند انتهاء التوبيخ. على سبيل المثال

ParkingSpots *parkingSpots = [[[ParkingSpots alloc] initWithMapViewController:self] autorelease];
parkingSpots.delegate = self;
parkingSpots.didInitialiseSelector = @selector(parkingSpotsInitialised:);
[parkingSpots startLengthyInitialisation];

- (void) parkingSpotsInitialised:(ParkingSpots*)parkingSpots {
  UpdateLocation *updatedLocation = [[[UpdateLocation alloc] initWithUserid:@"me" andCoordinate:annotation.coordinate withMapViewController:self] autorelease];
}

يمكنك أيضا استخدام الإخطارات لتحقيق نفس الشيء.

نصائح أخرى

أعتقد أنك بحاجة إلى النظر إلى الهدف - C ميزة المزامنة.

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