Tôi đang cố gắng tìm nạp trước một biểu đồ đối tượng của tệp trong kho lưu trữ Github sử dụng Octokit phụ thuộc vào Reactive Cococa. Tôi đang chạy vào một vấn đề tạo ra một tín hiệu mà sẽ đi sâu, đệ quy, cho đến khi không có thêm thư mục để được lấy. Đây là biểu đồ thư mục mẫu của repository of mine (lưu ý: các tệp đã bị bỏ qua để giữ cho biểu đồ đơn giản và rõ ràng).Recursive -flattenMap: với Cocoa phản ứng + OctoKit (lấy đồ thị đối tượng động từ dịch vụ web)
- (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];
}];
}
Là một lưu ý: -fetchContents:forRepository:
xây dựng một con đường yêu cầu và trả về một RACSignal
rằng enqueues một hoạt động yêu cầu HTTP (nó cố gắng làm theo ngữ nghĩa OctoKit does).
Vấn đề tôi đang chạy vào hiện tại là thiết lập này chỉ thực thi tìm nạp nội dung của kho lưu trữ (tức là đối tượng cấp cao nhất trong biểu đồ). -flattenMap:
được gọi, mảng tín hiệu được tạo thích hợp và trả về số -merge:
. Mục đích là để tạo ra một chuỗi đệ quy kết thúc khi không có nhiều loại thư mục con (có lẽ nên thêm một -filter:
để kiểm tra điều đó).
Mức tăng cường là tìm nạp toàn bộ biểu đồ tệp cho kho lưu trữ Github và được thông báo khi thao tác hoàn tất. Dưới đây là ví dụ về cách tôi muốn xử lý cuộc gọi này:
[[[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");
}];
Bất kỳ ý tưởng nào tại sao nó chỉ thực hiện cấp cao nhất? Tôi đã nghĩ rằng việc gọi -subscribeNext:
trên -fetchContentTreeForRepository:
sẽ là những gì thực thi tín hiệu trả lại cho -flattenMap:
, nhưng có vẻ như tôi hiểu nhầm điều gì đó. Giả thiết này xuất phát từ số chaining example trong readme Cocoa Reactive.
chỉnh sửa: I am dumb.
......... dammit – rnystrom
Tôi cũng có thể thêm rằng bạn chỉ có thể sử dụng thuộc tính 'rac_sequence' của mảng' thư mục' để thực hiện ánh xạ của từng thư mục với tín hiệu. Liệu điều tương tự nhưng có nhiều khai báo hơn. –