Note that there are some explanatory texts on larger screens.

plurals
  1. POHow send objects from a array in reactivecoccoa (and wait for each one)?
    primarykey
    data
    text
    <p>I need to sync several tables in sqlite from data from parse. I setup ReactiveCoccoa for it. However, I don't know how wait for the sync of one table before start the next. </p> <p>This is what I have now:</p> <pre><code>-(RACSignal *) syncTable:(NSString *)name showProgres:(BOOL)showProgres { @weakify(self); NSInteger __block count = 0; return [[RACSignal createSignal:^ RACDisposable *(id&lt;RACSubscriber&gt; subscriber) { PFQuery *query = [PFQuery queryWithClassName:name]; NSDate *date = [self versionForTable:name]; if (![name isEqualToString:@"Company"]) { [query whereKey:@"x_company" equalTo:[self currentCompany]]; [query whereKey:@"updatedAt" greaterThan:date]; } else { [query whereKey:@"objectId" equalTo:[self currentCompany].objectId]; } NSArray *objects = [query findObjects]; if (showProgres) { [SVProgressHUD showWithStatus:[NSString stringWithFormat:LOC_SYNC_TABLE, name]]; } for (PFObject *object in objects) { [subscriber sendNext:object]; // &lt;-- This is wrong! count++; if (showProgres) { [SVProgressHUD showProgress:count / [objects count] status:name]; } } [subscriber sendCompleted]; return nil; }] flattenMap:^RACStream *(PFObject *object) { @strongify(self); return [self syncRecords:name data:object]; }]; } </code></pre> <p>I don't see how send each PFObject and also do the progress stuff. </p> <p>P.D: This is the code with the changes proposed:</p> <pre><code>-(RACSignal *) syncRecords:(NSString *)table data:(PFObject *)data { @weakify(self); return [RACSignal createSignal:^ RACDisposable *(id&lt;RACSubscriber&gt; subscriber) { /* STUFF */ if (![db saveInternal:rs]) { NSDictionary *err = @{NSLocalizedDescriptionKey:[rs errorsAsString]}; [subscriber sendError:[NSError errorWithDomain:LOC_ERROR_SAVE code:0 userInfo:err]]; } else { /* STUFF */ } [subscriber sendCompleted]; return nil; }]; } -(RACSignal *) syncTable:(NSString *)name showProgres:(BOOL)showProgres { @weakify(self); NSInteger __block count = 0; return [[[RACSignal createSignal:^ RACDisposable *(id&lt;RACSubscriber&gt; subscriber) { /* STUFF */ NSArray *objects = [query findObjects]; /* If I do this in async way, the concat is not repected*/ /* STUFF */ for (PFObject *object in objects) { [subscriber sendNext:object]; /* STUFF */ } return nil; }] map:^RACStream *(PFObject *object) { @strongify(self); return [self syncRecords:name data:object]; }] concat]; } -(RACSignal *) fullSync { RACSignal *fullSync = [[[[[RACSignal createSignal:^ RACDisposable *(id&lt;RACSubscriber&gt; subscriber) { /* STUFF */ for (NSString *table in self.tablesFixed) { [subscriber sendNext:table]; } [subscriber sendCompleted]; return nil; }] map:^RACStream *(NSString *table) { @strongify(self); return [self syncTable:table showProgres:YES]; }] doError:^(NSError *error) { DDLogError(@"%@", error); [[Db currentDb] rollbackTransaction]; }] doCompleted:^{ [[Db currentDb] commitTransaction]; /* STUFF */ }] concat]; return fullSync; } -(RACSignal *) autoLogin:(PFUser *)user { @weakify(self); return [[RACSignal createSignal:^ RACDisposable *(id&lt;RACSubscriber&gt; subscriber) { /* STUFF */ [subscriber sendNext:user]; [subscriber sendCompleted]; return nil; }] flattenMap:^RACStream *(id user) { @strongify(self); return [self fullSync]; }]; } -(RACSignal *) login:(NSString *)email pwd:(NSString *)pwd { DDLogInfo(@"Login user %@", email); @weakify(self); RACSignal *login = [[RACSignal createSignal:^ RACDisposable *(id&lt;RACSubscriber&gt; subscriber) { [PFUser logInWithUsernameInBackground:email password:pwd block:^(PFUser *user, NSError *error) { if (error) { [subscriber sendError:error]; } else { [subscriber sendNext:user]; [subscriber sendCompleted]; } }]; return nil; }] flattenMap:^RACStream *(id user) { @strongify(self); return [self autoLogin:user]; }]; return login; } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload