5

मैं Octokit का उपयोग करके एक गीथब रिपोजिटरी में फ़ाइलों का ऑब्जेक्ट ग्राफ़ प्री-फ़ेच करने का प्रयास कर रहा हूं जो Reactive Cococa पर निर्भर करता है। मैं एक सिग्नल बनाने में एक समस्या में भाग रहा हूं जो तब तक ड्रिल करेगा, जब तक कि कोई और निर्देशिका न हो जाए। यहां repository of mine का एक उदाहरण निर्देशिका आलेख है (नोट: ग्राफ़ को सरल और साफ रखने के लिए फ़ाइलों को छोड़ा गया है)।रिकर्सिव-फ्लैटन मैप: प्रतिक्रियाशील कोको + ऑक्टोकिट (वेब ​​सेवा से डायनामिक ऑब्जेक्ट ग्राफ़ लाने)

Directory graph of RNGridMenu

- (RACSignal *)fetchContentTreeForRepository:(OCTRepository *)repository { 
    return [[self fetchContent:Nil forRepository:repository parentContent:nil] doCompleted:^{ 
     // fetching tree finished, persist in database 
    }]; 
} 

- (RACSignal *)fetchContent:(OCTContent *)content forRepository:(OCTRepository *)repository parentContent:(OCTContent *)parentContent { 
    return [[[[self.client fetchContents:content forRepository:repository] collect] deliverOn:RACScheduler.mainThreadScheduler] 
      flattenMap:^RACSignal *(NSArray *fetchedContents) { 
       // set the contents that were fetched 
       id<OCTContentStoreProtocol>store = content ?: repository; 
       store.contents = fetchedContents; 

       // only search for contents of type "dir" (directory) 
       NSArray *directories = [fetchedContents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"contentType = \"dir\""]]; 
       NSMutableArray *signals; 
       for (OCTContent *fetchedDir in directories) { 
        [signals addObject:[self fetchContent:fetchedDir forRepository:repository parentContent:content]]; 
       } 
       return [RACSignal merge:signals]; 
      }]; 
} 

एक नोट के रूप में: -fetchContents:forRepository: एक अनुरोध पथ बनाता है और एक RACSignal है कि HTTP अनुरोध आपरेशन enqueues रिटर्न (यह अर्थ विज्ञान OctoKit does का पालन करने की कोशिश करता है)।

समस्या जो मैं वर्तमान में चल रहा हूं वह यह है कि यह सेटअप केवल भंडार की सामग्री (यानी ग्राफ़ में शीर्ष-स्तरीय ऑब्जेक्ट) के लिए फ़ेच निष्पादित करता है। -flattenMap: कहा जाता है, संकेतों की सरणी उचित रूप से बनाई गई है, और -merge: वापस कर दिया गया है। इसका उद्देश्य एक पुनरावर्ती श्रृंखला बनाना है जो तब समाप्त होता है जब कोई और निर्देशिका प्रकार बच्चे नहीं होते हैं (संभवत: -filter: को उसमें जांचने के लिए जोड़ना चाहिए)।

इरादा एक गीथब भंडार के लिए फ़ाइलों के पूरे ग्राफ को लाने का है और ऑपरेशन समाप्त होने पर अधिसूचित किया जाना चाहिए। यहाँ कैसे मैं इस बुला प्रबंध करना चाहते हैं का एक उदाहरण है:

[[[GHDataStore sharedStore] fetchContentTreeForRepository:self.repository] 
subscribeNext:^(NSArray *contents) { 
    // this would be called each time a new set of contents is received 
    NSLog(@"received %i contents",[contents count]); 
} 
error:^(NSError *error) { 
    NSLog(@"error fetching: %@",error.localizedDescription); 
} 
completed:^{ 
    // this would be called when mapping the graph is finished 
    NSLog(@"finished fetching contents"); 
}]; 

किसी भी विचार क्यों यह केवल शीर्ष स्तर निष्पादित करता? मैंने सोचा होगा कि -subscribeNext: पर -fetchContentTreeForRepository: पर -flattenMap: के लिए लौटाए गए सिग्नल को निष्पादित किया जाएगा, लेकिन ऐसा लगता है कि मैं कुछ गलत समझ रहा हूं। यह धारणा प्रतिक्रियाशील कोको रीडेमे में chaining example से आता है।

संपादित करें: I am dumb.

उत्तर

4

मुद्दा यह है कि आप अपने NSMutableArray संकेतों के प्रारंभ नहीं है:

NSMutableArray *signals; 
for (OCTContent *fetchedDir in directories) { 
     [signals addObject:[self fetchContent:fetchedDir forRepository:repository parentContent:content]]; 
} 
return [RACSignal merge:signals]; 

NSMutableArray *signals = [NSMutableArray new] को बदलें कि पहली पंक्ति और यह काम करने लगता है।

+3

......... बांध – rnystrom

+3

मैं यह भी जोड़ सकता हूं कि आप सिग्नल में प्रत्येक निर्देशिका का नक्शा करने के लिए 'निर्देशिका' सरणी की 'rac_sequence' प्रॉपर्टी का उपयोग कर सकते हैं। क्या वही बात है लेकिन थोड़ा अधिक घोषणात्मक है। –

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