Reactivecocoa: ν•˜λ‚˜μ˜ 비동기 μž‘μ—… 만 μ‹œμž‘ν•˜κ³  μ‹ ν˜Έ κ²°κ³Όλ₯Ό κ³΅μœ ν•˜κΈ°μœ„ν•œ μ΅œμƒμ˜ 섀계 νŒ¨ν„΄

에 λ§Œλ“  2013λ…„ 09μ›” 27일  Β·  11μ½”λ©˜νŠΈ  Β·  좜처: ReactiveCocoa/ReactiveCocoa

RACSignal * updateSignal이 일뢀 비동기 μž‘μ—…μ„ μΊ‘μŠν™”ν•œλ‹€κ³  κ°€μ • ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. ꡬ독이 λ°œμƒν•˜λ©΄ 비동기 μž‘μ—… 쀑 λͺ¨λ“  μƒˆ ꡬ독이 첫 번째 κ΅¬λ…μžμ™€ λ™μΌν•œ κ²°κ³Όλ₯Ό λ°›κΈ°λ₯Ό μ›ν•©λ‹ˆλ‹€.
μ§€κΈˆ λ‚΄ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

- (RACSignal *)doWork
{
    if (_sharedWorkSignal) return _sharedWorkSignal;

    RACSignal *requestSignal = ...;
    _sharedWorkSignal = [[[[requestSignal publish] autoconnect] doCompleted:^{
        _sharedWorkSignal = nil;
    }] doError:^(NSError *error) {
        _sharedWorkSignal = nil;
    }];

    return _sharedWorkSignal;
}

μž‘λ™ν•˜μ§€λ§Œ μ–΄λ–»κ²Œ λ³΄μ΄λŠ”μ§€ 정말 λ§ˆμŒμ— 듀지 μ•ŠμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ€‘μš”ν•œ 것이 λ†“μΉ˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?

question

λͺ¨λ“  11 λŒ“κΈ€

-replay λ˜λŠ” -replayLazily λ₯Ό μ‚¬μš©ν•˜μ—¬μ΄λ₯Ό 달성 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ—¬μ „νžˆ 비동기 μž‘μ—…μ΄ μˆ˜ν–‰λ˜λŠ” λ™μ•ˆ μž¬μƒ 된 μ‹ ν˜Έλ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•΄μ΄ instnace λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Όν•©λ‹ˆκΉŒ?

κ·€ν•˜μ˜ μ§ˆλ¬Έμ„ μ΄ν•΄ν–ˆλŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. μœ μ‚¬ν•œ νŒ¨ν„΄μ„ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— API 호좜 전에 인증 토큰 을

λ‚΄κ°€ 잘λͺ»λœ μ„€λͺ…을 μ œκ³΅ν–ˆμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 첫 번째 κ΅¬λ…μœΌλ‘œ 인해 비동기 μž‘μ—…μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ λ‹€λ₯Έ κ΅¬λ…μ—μ„œ κ²°κ³Όλ₯Ό κ³΅μœ ν•˜κ³  μ‹Άμ§€λ§Œμ΄ μž‘μ—…μ΄ μ™„λ£Œλ˜κ³  μ‹ ν˜Έκ°€ μ™„λ£Œλ˜λ©΄ μƒˆ ꡬ독이이 μž‘μ—…μ„ λ‹€μ‹œ μ‹œμž‘ν•˜κΈ°λ₯Ό μ›ν•©λ‹ˆλ‹€. λ‚΄ μ˜μ–΄ μ£„μ†‘ν•©λ‹ˆλ‹€;)

이 경우, 당신이 ν•œ 것보닀 훨씬 더 λ‚˜μ€ μ ‘κ·Ό 방법이 μžˆλŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λͺ‡ 가지 μœ μ˜ν•  사항이 μžˆμŠ΅λ‹ˆλ‹€.

  1. _sharedWorkSignal 읽기 및 μ“°κΈ°λŠ” μŠ€λ ˆλ“œλ‘œλΆ€ν„° μ•ˆμ „ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ atomic 속성을 μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€.
  2. -publish 및 -autoconnect λŒ€μ‹  -replayLazily 을 (λ₯Ό) μ‚¬μš©ν•˜κ³  싢을 κ²ƒμž…λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ μƒˆ κ΅¬λ…μžκ°€ μ—°κ²°λ˜κΈ° 전에 전솑 된 값을받지 λͺ»ν•©λ‹ˆλ‹€.
  3. -doCompleted: 및 -doError: λŒ€μ‹  -finally: λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

큰! μ €μŠ€ν‹΄ 정말 κ°μ‚¬ν•©λ‹ˆλ‹€! -finally μ–΄λ–»κ²Œ 놓칠 수 μžˆμŠ΅λ‹ˆκΉŒ? 그리고 κ·€ν•˜μ˜ λ©”λͺ¨μ— κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€! 닫은.

: 슀파클 :

λ©”μ„œλ“œ, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ λ˜λŠ” 속성을 μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ €λ©΄ λ‹€μŒκ³Ό 같이 μ‹œλ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

RACSignal *testSig = [[RACSignal return:[NSMutableArray arrayWithCapacity:1]] map:^id(NSMutableArray *array) {

            if (array.count == 0) {

                RACSignal *sig = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {


                    // Do stuff
                        [subscriber sendNext:something];
                        [subscriber sendCompleted];

                        return nil;
                    }] doCompleted:^{
                        [array removeAllObjects];
                    }];


                    [array addObject:sig.replayLast];
                }

                return array.lastObject;
}].replayLazily;

λ°°μ—΄μ΄λ‚˜ 주제λ₯Ό μ‚¬μš©ν•˜λ©΄ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ±°λ‚˜ 속성을 μ‚¬μš©ν•˜μ§€ μ•Šκ³ λ„ 무언가에 λŒ€ν•œ μ°Έμ‘°λ₯Ό μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 μ½”λ“œλŠ” μŠ€λ ˆλ“œλ‘œλΆ€ν„° μ•ˆμ „ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ•Œλ•Œλ‘œ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 κ°€μž₯ 쒋은 λŒ€λ‹΅μž…λ‹ˆλ‹€.

μ’‹μŠ΅λ‹ˆλ‹€. κ°€μž₯ μ•ˆμ „ν•œ μ „λž΅μ€ μ›μž 속성을 "액컀"둜 μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 특히 RAC λΈ”λ‘μ—μ„œ μ§œλ‚΄λŠ” λͺ¨λ“  λ³€μˆ˜μ— λŒ€ν•΄ κ·Έλ ‡μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” ν•„μš”ν•  λ•Œ "λ‹€μ‹œ 트리거"ν•˜μ§€ μ•Šμ„ 곡유 μ‹ ν˜Έμ™€ 같은 μ’…λ₯˜μ˜ λ™μΌν•œ λ¬Έμ œμ— μ§λ©΄ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
RACMultiConnection λ°©μ‹μœΌλ‘œ κ°€λŠ₯ν•œ λ§Žμ€ μ†”λ£¨μ…˜μ„ μ‹œλ„ν–ˆμ§€λ§Œ 항상 λ™μΌν•œ λ¬Έμ œμ— 직면 ν•΄ μžˆμŠ΅λ‹ˆλ‹€. μ†ŒμŠ€ μ‹ ν˜Έλ₯Ό λ‹€μ‹œ 트리거 ν•  λ•Œλ§ˆλ‹€ λ‹€μŒμœΌλ‘œ μ „μ†‘λ˜λŠ” λͺ¨λ“  이전 κ΅¬λ…μžμ—κ²Œ μ „μ†‘λ©λ‹ˆλ‹€.

더 μžμ„Ένžˆ :

1) λ„€νŠΈμ›Œν¬ μš”μ²­μ€ 이전 λŒ€λ¦¬μž κ΅¬ν˜„μ„ λž˜ν•‘ν•˜λŠ” νŽΈλ¦¬ν•œ λ©”μ„œλ“œμ— μ˜ν•΄ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

RACSignal *performRequestSignal =
    [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // Create data received signal
        RACSignal *dataReceivedSignal = [[self rac_signalForSelector:@selector(dataReceived:forRequest:) fromProtocol:@protocol(MainDataControllerDelegate)] filter:^BOOL(RACTuple *returnTuple) {
            DataRequest *request = returnTuple.second;
            DataResponse *dataResponse = returnTuple.first;

            return ((request.type == dataRequest.type) && ([dataResponse.value isKindOfClass:dataResponseClass]));
        }];

        // Subscribe
        [dataReceivedSignal subscribeNext:^(RACTuple *returnTuple) {
            DataResponse *dataResponse = returnTuple.first;
            [subscriber sendNext:dataResponse.value];
            [subscriber sendCompleted];

        }];

        // Create data request failed signal
        RACSignal *requestFailedSignal = [self rac_signalForSelector:@selector(requestFailed:error:) fromProtocol:@protocol(MainDataControllerDelegate)];

        // Subscribe
        [requestFailedSignal subscribeNext:^(RACTuple *returnTuple) {
            NSError *error = returnTuple.second;
            [subscriber sendError:error];
        }];

        // Trigger the request to API
        [[MainDataController sharedInstance] addRequest:dataRequest delegate:self priority:queuePriority];

        return [RACDisposable disposableWithBlock:^{
            [[MainDataController sharedInstance] cancelRequest:dataRequest];
        }];
    }];

    return performRequestSignal;

2)이 λ©”μ†Œλ“œλŠ” 이전 λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ "retrieveThingsSignal"이라고 λΆ€λ₯΄λŠ” 편의 μ‹ ν˜Έλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

- (RACSignal *)retrieveThings
{
    if (_retrieveDebtors) return _retrieveDebtors;

    RACSignal *requestSignal = [self retrieveThingsSignal];
    _retrieveDebtors = [[requestSignal replayLast] finally:^{
        _retrieveThings = nil;
    }];

    return _retrieveThings;

3)이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” μ‹ ν˜Έλ₯Ό λ‹€μ‹œ νŠΈλ¦¬κ±°ν•˜μ§€ μ•Šμ„ λ•Œλ§ˆλ‹€

[[self retrieveThings] subscribeNext:^(NSArray *things) {
        @strongify(self);
        self.things = things;
    } error:^(NSError *error) {
        @strongify(self)
        self.things = nil;
    }];

self.things λŠ” retreiveThings μƒˆ μš”μ²­μ„ν•΄μ•Ό ν•  λ•Œλ§ˆλ‹€ 그에 따라 μ—…λ°μ΄νŠΈλ˜μ§€λ§Œ, 1) 단계에 쀑단 점을두면 next: λŠ” λͺ¨λ“  이전 κ΅¬λ…μžμ—κ²Œ μ „μ†‘λ©λ‹ˆλ‹€. retrieveThings 두 번 ν˜ΈμΆœν•˜λ©΄ ν•΄λ‹Ή 쀑단 μ μ—μ„œ κΈ°λ³Έ μ‹ ν˜Έκ°€ next: λ₯Ό 두 λͺ…μ˜ λ‹€λ₯Έ κ΅¬λ…μžμ—κ²Œ μ „μ†‘ν•œλ‹€λŠ” 것을 μˆ˜μ‹ ν•©λ‹ˆλ‹€ (ν•˜λ‚˜λŠ” μ‹€μ œλ‘œ subscribeNext: 블둝을 μ‹€ν–‰ 함). . κ°€μž…μžκ°€ 3 ~ 3 λͺ…이면 ...

이 λ™μž‘μ„ 방지 ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

맀번 λ„€νŠΈμ›Œν¬ μš”μ²­μ„ νŠΈλ¦¬κ±°ν•˜μ§€ μ•Šκ³  retrieveThings λ©”μ„œλ“œμ—μ„œ λ§ˆμ§€λ§‰μœΌλ‘œ 보낸 값을 κ³΅μœ ν•˜κ³  μ‹Άμ§€λ§Œ ν•„μš”ν•œ 경우 λ‹€μŒ ꡬ독이 μ‹€μ œλ‘œ λ„€νŠΈμ›Œν¬ μš”μ²­μ„ νŠΈλ¦¬κ±°ν•˜λ„λ‘ μ •λ¦¬ν•΄μ•Όν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰