2015-04-16 3 views
4

Я создаю функцию, где пользователи моего приложения могут найти своих друзей в Facebook и добавить их в приложение. Есть три шага, которые я должен сделать:Как выполнить это с ReactiveCocoa

  1. Получить подключенные в данный момент пользователь
  2. Получить пользователь Facebook
  3. Получить приложения Пользователей (это зависит от стадии 2)

После все эти полные мне тогда необходимо объединить/свести три результирующих массива в конечный массив.

Я создал три функции, которые все возвращают RACSignal

getUsersWithFacebookIds, getConnectedUsers и getFacebookUsers

Я не уверен, как подключить все это с помощью ReactiveCocoa.

enter image description here

ответ

7

Once All Are Done Do Something With All, можно достичь с помощью:

[[RACSignal combineLatest:@[connectUsersSignal,facebookUsersSignal,applicationUsersSignal]] subscribeNext:^(RACTuple *users) { 
    NSArray *connectedUsers = [users first]; 
    NSArray *facebookUsers = [users second]; 
    NSArray *applicationUsers = [users third]; 

}]; 

Другая часть отсутствует, как вы делаете applicationUsersSignal зависит от facbookUsersSignal. Что можно сделать следующим образом:

- (RACSignal *)applicationUsersSignalWithFacebookUsersSignal:(RACSignal *)fbSignal 
{ 
    return [fbSignal flattenMap:^RACStream *(NSArray *facebookUsers) { 
     return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { 
      // Do what you have to do with the facebookUsers 
      return nil; 
     }]; 
    }]; 
} 

Просто добавьте немного больше ответа. Я предполагаю, что это холодные сигналы (сигналы, которые еще не начались, хотя и не были подписаны). Таким образом, идея использования combineLatest: заключается в том, что вы хотите захватить точку, в которой каждый отдельный сигнал отправляется как минимум один next, after that you subscribe to it so it can begin. Наконец, вы можете получить их значения от RACTuple.


Я снова прочитал ваш вопрос, и вы хотите, чтобы они пришли все в одном массиве:

[[[RACSignal combineLatest:@[connectUsersSignal,facebookUsersSignal,applicationUsersSignal]] map:^id(RACTuple *allArrays) { 
    return [allArrays.rac_sequence foldLeftWithStart:[NSMutableArray array] reduce:^id(id accumulator, id value) { 
     [accumulator addObjectsFromArray:value]; 
     return accumulator; 
    }]; 
}] subscribeNext:^(NSArray *allUsers) { 
    // Do Something 
}]; 
+0

кажется, что последний фрагмент кода может быть упрощена с помощью 'combineLatest: reduce' –

+1

@ MichałCiuba вас будет получать 3 массива в 'combLatest: reduce:', который отличается от того, чтобы все 3 массива были сплющены в один. – Peres

+1

@RuiAAPeres Вы можете использовать 'combLatest: reduce:', чтобы избежать вызовов 'allArrays.first',' allArrays.second' и т. Д. Но в этом случае вы можете просто получить «rac_sequence» из самого кортежа, а «map» остается соответствующей операцией. –