iPhone SDK: يرى ViewDIDLoad () NSArray فارغة، ولكن يتم ملؤها بطريقة مفوضة (mgtwitterengine)

StackOverflow https://stackoverflow.com/questions/1854345

سؤال

ربما يكون هذا واضحا، لكنني بعض الشيء مبتدئ وقضى ساعات في محاولة لمعرفة ذلك.

في ViewDidLoad () لدي مكالمة إلى وظيفة على كائن mgtwitterengine (كائن مخصص)، مع إدخال. إذا كان الطلب (إلى Twitter، في هذه الحالة) ناجحا، فإنه يدعو إلى طريقة مفوضة مناسبة.

في viewdididload ()، إنه مثل هذا:

[myTwitterEngine getSearchResultsForQuery:@"#quote" sinceID:0 startingAtPage:0 count:10];

طريقة المندوب التي يدعوها في حالة طلب البحث الناجح يبدو وكأنه هذا:

- (void)searchResultsReceived:(NSArray *)searchResults forRequest:(NSString *)connectionIdentifier
{
    NSMutableArray *tempArray = [[[NSMutableArray alloc] init] autorelease];    

    if ([searchResults count] > 0)
    {
        for (int n=0; n < 15; n++) {

        NSDictionary *singleResult = [searchResults objectAtIndex:n];

        NSString *fromUser = [singleResult valueForKey:@"from_user"];
        NSString *text = [singleResult valueForKey:@"text"]; 

        Message *newMessage = [[Message alloc] initWithUsername:fromUser message:text];

        [tempArray addObject:newMessage];
        }

        self.messages = tempArray;

        // Okay, works here.
        NSLog(@"From delegate method: \n %@", [[self.messages objectAtIndex:13] theMessage]);
    }
}

الشيء الذي لا أستطيع معرفةه هو: في النهاية، حيث أقول "حسنا، العمل هنا"، من الواضح أن الذاتي. يتم تعبئة الذات (nsarray) مع المعلومات التي أريدها.

ومع ذلك، فإن Helf.Messages فارغة إذا اتصلت به مرة أخرى في ViewDidLoad () بعد الطريقة الأولى. هذا هو ما قمت به في fiewdididload ():

[myTwitterEngine getSearchResultsForQuery:@"#quote"];
NSLog(@"\n Before Or After? \n");
NSLog(@"From viewDidLoad: %@", [[self.messages objectAtIndex:13] theMessage]);

النتائج غريبة. نتيجة لأول NSLOG يأتي قبل نتائج طريقة المندوب. إليك خرج وحدة التحكم:

2009-12-05 23:15:20.758 Entendu[54463:207] 
 Before Or After? 
2009-12-05 23:15:20.761 Entendu[54463:207] From viewDidLoad: (null)
2009-12-05 23:15:21.005 Entendu[54463:207] Request succeeded for connectionIdentifier = 92B2E7EC-AA2F-4301-812E-E8E5AEAF7035
2009-12-05 23:15:21.007 Entendu[54463:207] From delegate method: 
 RT @thankfulnotes: RT @felicelam It usually takes me more than three weeks to prepare a good impromptu speech. Mark Twain #quote

في النهاية أريد استخدام صفيف الرسائل كصورة بيانات لجدول. كيف يمكنني الوصول إلى هذا المتغير من داخل طريقة المندوب في أماكن أخرى في التنفيذ؟

أي شخص يعرف لماذا يأتي مندوب الناتج من طريقة المندوب في النهاية على الرغم من أنني اتصلت الوظيفة الفعلية قبل أو بعد NSLog؟

أي مساعدة في تقديرها!

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

المحلول

أنا لا أعرف شيئا من mgtwitterengine، ولكن بوضوح -getSearchResultsForQuery: هي طريقة غير متزامنة؛ سيعود على الفور واتصل بطريق المندوب الخاص بك في وقت متأخر في وقت لاحق عندما تتوفر النتائج.

صفيفك فارغ في -viewDidLoad لأن النتائج لم تتلق بعد. علاوة على ذلك، سوف صفيف الخاص بك دائماً أن تكون فارغة في -viewDidLoad نظرا لأن طريقة منفصك لا يمكن استدعاؤها حتى تقوم بإرجاع التحكم في حلقة التشغيل الخاصة بك.

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