8

पर लौटें I पुस्तकालय का उपयोग कर एक टैग से आईडी प्राप्त करने का प्रयास कर रहा हूं।पृष्ठभूमि में कुछ काम करें और परिणाम

मैं निम्नलिखित के साथ आया था। लूप जो टैग की तलाश में है पृष्ठभूमि में किया जाता है और मुझे टैगएएसस्ट्रिंग में सही परिणाम मिलता है।

-(void) readTag { 
    NSLog(@"readTag"); 
    unsigned char * tagUID = (unsigned char *) malloc(M1K_UID_SIZE * sizeof(char)); 
    //work to do in the background 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     ERR ret; 
     while ((ret = scanner->IsTagAvailable(tagUID)) != ERR_TAG_AVAILABLE) { 
      NSLog(@"ret: %d", ret); 
     } 


     //main thread 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      if(ret == ERR_TAG_AVAILABLE) { 
       NSLog(@"tag available"); 
       NSString *tagAsString = [[[NSString alloc] initWithFormat:@"%x%x%x%x", tagUID[0],tagUID[1],tagUID[2],tagUID[3]] retain]; 

      } 
     }); 
    }); 
} 

मैं तो मैं फोन करने के लिए सक्षम हो जाएगा कि मान देने के लिए सक्षम होने के लिए करना चाहते हैं:

NSString * myTag = [self readTag]; 

संभव है? आपकी मदद के लिए धन्यवाद, माइकल

उत्तर

12

यह संभव है, लेकिन है कि समारोह से एक स्ट्रिंग लौटने के साथ समस्या यह है कि यह जबकि आप पृष्ठभूमि में काम करने के अपने बुला धागा धारण करने की आवश्यकता होगी है - इस प्रकार के लाभ के खोने पृष्ठभूमि धागा। (dispatch_sync वह है जो आप ऐसा करने के लिए उपयोग करेंगे - हालांकि मैं इसकी अनुशंसा नहीं करता)।

ब्लॉक का उपयोग करते समय अपने प्रोग्राम को एसिंक्रोनस प्रतिमान के साथ बेहतर फिट करने के लिए सर्वोत्तम है। जब काम पूरा हो जाता है तो परिणाम के साथ संदेश भेजने के परिणामस्वरूप जो कुछ भी इंतजार कर रहा है उसे सूचित करना चाहिए। आपके उदाहरण में आप इसे मुख्य कतार पर प्रेषित कोड के ब्लॉक में डाल देंगे।

@interface TagManager 
- (void)fetchTag; 
- (void)tagFetched:(NSString *)tag; 
@end 

@implementation TagManager 
- (void)fetchTag { 
    // The following method does all its work in the background 
    [someObj readTagWithObserver:self]; 
    // return now and at some point someObj will call tagFetched to let us know the work is complete 
} 

- (void)tagFetched:(NSString *)tag { 
    // The tag read has finished and we can now continue 
} 
@end 

फिर अपने readTag समारोह इतनी के रूप में संशोधित किया जाएगा:

- (void)readTagWithObserver:(id)observer { 
    ... 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     ... 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      if (tag is ok) { 
       [observer tagFetched:tag]; 
      } 
     }); 
    });       
} 

मुख्य विचार यह है कि आप दो चरणों

  1. में अपने संसाधन को विभाजित करने का अनुरोध कुछ काम है कि जरूरत है किया (मेरे उदाहरण में fetchTag)
  2. परिणाम समाप्त होने पर परिणाम को संसाधित करें (टैगफेटेड: मेरे उदाहरण में)
+0

आपके उत्तर के लिए धन्यवाद। क्या आपका मतलब है एनएसएनोटिफिकेशन का उपयोग अधिसूचित करने के लिए या क्या कोई अन्य तरीका है? – Themikebe

+0

एनएसएनोटिफिकेशन एक संभावित तरीका है, हालांकि इस उदाहरण में मैं केवल संदेश पासिंग (विधि कॉल) का उपयोग करता हूं। मैं एक उदाहरण के साथ अपना जवाब संपादित कर दूंगा – jjwchoy

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^