दिलचस्प पोस्ट
सरल सी scanf काम नहीं करता है? पायथन: प्रिंट कमांड के साथ नई लाइन से बचें असतत एक्स पैमाने का क्रम बदलें मेरा। सुरक्षा नियमों में जोड़ा गया नियम और नियम को ध्यान में नहीं रखा गया है जावास्क्रिप्ट में संकेतक? आईओएस 9 में स्वाइप-योग्य तालिका देखें सेल सी में तार करने के लिए enum नाम कन्वर्ट करने के लिए कैसे जावा में पासवर्ड सुरक्षित ज़िप फ़ाइल जावा – क्या एक IOException फेंकता है Android 4.3 मेनू आइटम showAsAction = "हमेशा" पर ध्यान नहीं दिया वीबीए का इस्तेमाल करते हुए टीएक्सटी फाइल बनाने और लिखना किसी अन्य में चयन के आधार पर एक ड्रॉपडाउन तैयार करें VBA और एमएस एक्सेस में बैंग नोटेशन और डॉट नोटेशन UINavigationBar पारदर्शी बनाओ माता-पिता के नियंत्रण की चौड़ाई के लिए WPF टैब आइटम शीर्षकों को कैसे बढ़ाएं

findObjectsInBackgroundWithBlock: पार्स से डेटा प्राप्त करता है, लेकिन डेटा केवल ब्लॉक के भीतर मौजूद होता है

पार्स से डेटा को पुनर्प्राप्त करने का प्रयास करने के लिए मैंने निम्न टेस्ट क्लास बनाया है:

-(void)retrieveDataFromParse { PFQuery *query = [PFQuery queryWithClassName:@"TestObject"]; [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { if(!error){ for (PFObject *object in objects){ NSString *nameFromObject = [NSString stringWithFormat:@"%@", [object objectForKey:@"Name"]]; NSString *dateFromObject = [NSString stringWithFormat:@"%@", [object createdAt]]; NSString *scoreFromObject = [NSString stringWithFormat:@"%@", [object objectForKey:@"Score"]]; [self addNewScore:scoreFromObject andDate:dateFromObject forUserName:nameFromObject]; NSLog(@"The dictionary is %@", self.scoreDictionary); //<-- here it works printing out the whole dictionary } } else { NSLog(@"Error: %@ %@", error, [error userInfo]); } }]; NSLog(@"The dictionary is %@", self.scoreDictionary); //<- but after the block is called, here the dictionary is again empty... } 

कोड के अंदर टिप्पणी किए गए अनुभाग के अनुसार, जब मैं कोड के अंदर self.scoreDictionary को मुद्रित करता हूँ, यह ठीक से काम करता है, और मुझे अपना पूरा डिक्शनरी दिखाई देता है क्योंकि यह वृद्धिशील रूप से भर जाता है हालांकि, ब्लॉक समाप्त होने के बाद, जब मैं फिर से शब्दकोश मुद्रित करता हूँ, अब यह खाली है मैंने क्वेरी एपीआई दस्तावेजों के साथ डबल चेक किया है, लेकिन मैं अभी भी अनिश्चित हूँ कि मैं गलत तरीके से क्या कर रहा हूं।

Solutions Collecting From Web of "findObjectsInBackgroundWithBlock: पार्स से डेटा प्राप्त करता है, लेकिन डेटा केवल ब्लॉक के भीतर मौजूद होता है"

पिछले NSLog(@"The dictionary is %@", self.scoreDictionary) बयान वास्तव में ब्लॉक पूर्ण होने के बाद निष्पादित नहीं करता है। यह findObjectsInBackgroundWithBlock विधि रिटर्न के बाद कार्यान्वित करता है। findObjectsInBackgroundWithBlock संभवतः एक अलग थ्रेड में कुछ चलाता है, और आपके ब्लॉक वास्तव में बिल्कुल भी अंतिम NSLog बयान के बाद समय की लंबाई तक निष्पादित नहीं हो सकता ग्राफिक रूप से, ऐसा कुछ संभवतः हो रहा है:

 Thread 1 -------- retriveDataFromParse called invoke findObjectsInBackgroundWithBlock findObjectsInBackgroundWithBlock queues up work on another thread findObjectsInBackgroundWithBlock returns immediately | NSLog statement - self.scoreDictionary not yet updated | retriveDataFromParse returns | . V . Thread 2, starting X milliseconds later . -------- . findObjectsInBackgroundWithBlock does some work . your block is called . for-loop in your block . Now self.scoreDictionary has some data . NSLog statement inside your block 

आप शायद इसके बारे में सोचना चाहते हैं, आप इसे पुनः प्राप्त किए जाने के बाद अपने स्कोरएपर्स डेटा के साथ क्या करना चाहते हैं ? उदाहरण के लिए, क्या आप UI को अपडेट करना चाहते हैं, कुछ अन्य विधि कॉल करते हैं, आदि? आप इसे अपने ब्लॉक के अंदर करना चाहते हैं, जिस पर आप जानते हैं कि डेटा को सफलतापूर्वक पुनर्प्राप्त किया गया है। उदाहरण के लिए, यदि आपके पास तालिका दृश्य था, तो आप पुनः लोड करना चाहते थे, तो आप ऐसा कर सकते हैं:

 for (PFObject *object in objects){ .... } dispatch_async(dispatch_get_main_queue(), ^{ [self updateMyUserInterfaceOrSomething]; }); 

प्रेषण_सिसंक को नोट करें – अगर आपके डेटा को अद्यतन करने के बाद आपको जो काम करना है, इसमें यूआई बदलना शामिल है, तो आप चाहते हैं कि मुख्य थ्रेड पर चलें

अंतिम NSLog(@"The dictionary is %@", self.scoreDictionary) पूरा ब्लॉक निष्पादित होने से पहले निष्पादित किया जाता है। समय तक, self.scoreDictionary सुनिश्चित करने के लिए खाली होगा।

इसके अलावा, मुख्य थ्रेड पर पूरा ब्लॉक निष्पादित होगा। आप निम्न लिंक का उल्लेख कर सकते हैं

https://parse.com/questions/what-thread-does-findobjectsinbackgroundwithblock-complete-on