這樣好用的ReactiveCocoa,根本停不下來(lái)(轉(zhuǎn))

前戲
我個(gè)人非常推崇ReactiveCocoa,它就像中國(guó)的太極,太極生兩儀,兩儀生四象,四象生八卦,八卦生萬(wàn)物。ReactiveCocoa是一個(gè)高度抽象的編程框架,它真的很抽象,初看你不知道它是要干嘛的,等你用上了之后,就發(fā)現(xiàn),有了它你是想干嘛就干嘛,編碼從未如此流暢。

在此我不會(huì)講ReactiveCocoa的原理,因?yàn)椴荒苤v明白的才叫抽象。我也不會(huì)提及相關(guān)概念。我只是讓你看看我用著它是有多爽。

代碼的四十八手

察值
你別動(dòng),你一動(dòng)我就知道。

@weakify(self);
[RACObserve(self, value) subscribeNext:^(NSString* x) {
    @strongify(self);
    NSLog(@"你動(dòng)了");
}];

單邊

你唱歌,我就跳舞。

textField的內(nèi)容長(zhǎng)度隱射成BOOL值,綁定到confirmButton的enable屬性上面,當(dāng)textField輸入內(nèi)容不為空的時(shí)候,confirmButton的enable = YES。

    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(idsubscriber) {
        [subscriber sendNext:@"唱歌"];
        [subscriber sendCompleted];
        return nil;
    }];
    RAC(self, value) = [signalA map:^id(NSString* value) {
        if ([value isEqualToString:@"唱歌"]) {
            return @"跳舞";
        }
        return @"";
    }];

雙邊

你向西,他就向東,他向左,你就向右。

    RACChannelTerminal *channelA = RACChannelTo(self, valueA);
    RACChannelTerminal *channelB = RACChannelTo(self, valueB);
    [[channelA map:^id(NSString *value) {
        if ([value isEqualToString:@"西"]) {
            return @"東";
        }
        return value;
    }] subscribe:channelB];
    [[channelB map:^id(NSString *value) {
        if ([value isEqualToString:@"左"]) {
            return @"右";
        }
        return value;
    }] subscribe:channelA];
    [[RACObserve(self, valueA) filter:^BOOL(id value) {
        return value ? YES : NO;
    }] subscribeNext:^(NSString* x) {
        NSLog(@"你向%@", x);
    }];
    [[RACObserve(self, valueB) filter:^BOOL(id value) {
        return value ? YES : NO;
    }] subscribeNext:^(NSString* x) {
        NSLog(@"他向%@", x);
    }];
    self.valueA = @"西";
    self.valueB = @"左";
2015-08-15 20:14:46.544 Test[2440:99901] 你向西  
2015-08-15 20:14:46.544 Test[2440:99901] 他向東  
2015-08-15 20:14:46.545 Test[2440:99901] 他向左  
2015-08-15 20:14:46.545 Test[2440:99901] 你向右

代理

你是程序員,你幫我寫(xiě)個(gè)app吧。

@protocol Programmer
- (void)makeAnApp;
@end
RACSignal *ProgrammerSignal =  
[self rac_signalForSelector:@selector(makeAnApp)
               fromProtocol:@protocol(Programmer)];
[ProgrammerSignal subscribeNext:^(RACTuple* x) {
    NSLog(@"花了一個(gè)月,app寫(xiě)好了");
}];
[self makeAnApp];
2015-08-15 20:46:45.720 Test[2817:114564] 花了一個(gè)月,app寫(xiě)好了

廣播

知道你的頻道,我就能聽(tīng)到你了。

    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"代碼之道頻道" object:nil] subscribeNext:^(NSNotification* x) {
        NSLog(@"技巧:%@", x.userInfo[@"技巧"]);
    }];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"代碼之道頻道" object:nil userInfo:@{@"技巧":@"用心寫(xiě)"}];
2015-08-15 20:41:15.786 Test[2734:111505] 技巧:用心寫(xiě)

連接

生活是一個(gè)故事接一個(gè)故事。

    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(idsubscriber) {
        [subscriber sendNext:@"我戀愛(ài)啦"];
        [subscriber sendCompleted];
        return nil;
    }];
    RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(idsubscriber) {
        [subscriber sendNext:@"我結(jié)婚啦"];
        [subscriber sendCompleted];
        return nil;
    }];
    [[signalA concat:signalB] subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
2015-08-15 12:19:46.707 Test[1845:64122] 我戀愛(ài)啦  
2015-08-15 12:19:46.707 Test[1845:64122] 我結(jié)婚啦

合并

污水都應(yīng)該流入污水處理廠被處理。

    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(idsubscriber) {
        [subscriber sendNext:@"紙廠污水"];
        return nil;
    }];
    RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(idsubscriber) {
        [subscriber sendNext:@"電鍍廠污水"];
        return nil;
    }];
    [[RACSignal merge:@[signalA, signalB]] subscribeNext:^(id x) {
        NSLog(@"處理%@",x);
    }];
2015-08-15 12:10:05.371 Test[1770:60147] 處理紙廠污水  
2015-08-15 12:10:05.372 Test[1770:60147] 處理電鍍廠污水

組合

你是紅的,我是黃的,我們就是紅黃的,你是白的,我沒(méi)變,我們是白黃的。

    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(idsubscriber) {
        [subscriber sendNext:@"紅"];
        [subscriber sendNext:@"白"];
        return nil;
    }];
    RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(idsubscriber) {
        [subscriber sendNext:@"白"];
        return nil;
    }];
    [[RACSignal combineLatest:@[signalA, signalB]] subscribeNext:^(RACTuple* x) {
        RACTupleUnpack(NSString *stringA, NSString *stringB) = x;
        NSLog(@"我們是%@%@的", stringA, stringB);
    }];
2015-08-15 12:14:19.837 Test[1808:62042] 我們就是紅黃的  
2015-08-15 12:14:19.837 Test[1808:62042] 我們是白黃的

壓縮

你是紅的,我是黃的,我們就是紅黃的,你是白的,我沒(méi)變,哦,那就等我變了再說(shuō)吧。

    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(idsubscriber) {
        [subscriber sendNext:@"紅"];
        [subscriber sendNext:@"白"];
        return nil;
    }];
    RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(idsubscriber) {
        [subscriber sendNext:@"白"];
        return nil;
    }];
    [[signalA zipWith:signalB] subscribeNext:^(RACTuple* x) {
        RACTupleUnpack(NSString *stringA, NSString *stringB) = x;
        NSLog(@"我們是%@%@的", stringA, stringB);
    }];
2015-08-15 20:34:24.274 Test[2660:108483] 我們是紅白的

映射

我可以點(diǎn)石成金。

    RACSignal *signal = [[RACSignal createSignal:^RACDisposable *(idsubscriber) {
        [subscriber sendNext:@"石"];
        return nil;
    }] map:^id(NSString* value) {
        if ([value isEqualToString:@"石"]) {
            return @"金";
        }
        return value;
    }];
    [signal subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
2015-08-16 20:00:12.853 Test[740:15871] 金

歸約

糖加水變成糖水。

    RACSignal *sugarSignal = [RACSignal createSignal:^RACDisposable *(idsubscriber) {
        [subscriber sendNext:@"糖"];
        return nil;
    }];
    RACSignal *waterSignal = [RACSignal createSignal:^RACDisposable *(idsubscriber) {
        [subscriber sendNext:@"水"];
        return nil;
    }];
    [[RACSignal combineLatest:@[sugarSignal, waterSignal] reduce:^id (NSString* sugar, NSString*water){
        return [sugar stringByAppendingString:water];
    }] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
2015-08-16 20:07:00.356 Test[807:19177] 糖水

過(guò)濾

未滿十八歲,禁止進(jìn)入。

    [[[RACSignal createSignal:^RACDisposable *(idsubscriber) {
        [subscriber sendNext:@(15)];
        [subscriber sendNext:@(17)];
        [subscriber sendNext:@(21)];
        [subscriber sendNext:@(14)];
        [subscriber sendNext:@(30)];
        return nil;
    }] filter:^BOOL(NSNumber* value) {
        return value.integerValue >= 18;
    }] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
2015-08-16 20:11:20.071 Test[860:21214] 21  
2015-08-16 20:11:20.071 Test[860:21214] 30

扁平

打蛋液,煎雞蛋,上盤(pán)。

    [[[[RACSignal createSignal:^RACDisposable *(idsubscriber) {
        NSLog(@"打蛋液");
        [subscriber sendNext:@"蛋液"];
        [subscriber sendCompleted];
        return nil;
    }] flattenMap:^RACStream *(NSString* value) {
        return [RACSignal createSignal:^RACDisposable *(idsubscriber) {
            NSLog(@"把%@倒進(jìn)鍋里面煎",value);
            [subscriber sendNext:@"煎蛋"];
            [subscriber sendCompleted];
            return nil;
        }];
    }] flattenMap:^RACStream *(NSString* value) {
        return [RACSignal createSignal:^RACDisposable *(idsubscriber) {
            NSLog(@"把%@裝到盤(pán)里", value);
            [subscriber sendNext:@"上菜"];
            [subscriber sendCompleted];
            return nil;
        }];
    }] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
2015-08-16 20:39:34.786 Test[1226:34386] 打蛋液  
2015-08-16 20:39:34.787 Test[1226:34386] 把蛋液倒進(jìn)鍋里面煎  
2015-08-16 20:39:34.787 Test[1226:34386] 把煎蛋裝到盤(pán)里  
2015-08-16 20:39:34.787 Test[1226:34386] 上菜

秩序

把大象塞進(jìn)冰箱只需要三步:打開(kāi)冰箱門(mén),把大象塞進(jìn)冰箱,關(guān)上冰箱門(mén)。

    [[[[RACSignal createSignal:^RACDisposable *(idsubscriber) {
        NSLog(@"打開(kāi)冰箱門(mén)");
        [subscriber sendCompleted];
        return nil;
    }] then:^RACSignal *{
       return [RACSignal createSignal:^RACDisposable *(idsubscriber) {
           NSLog(@"把大象塞進(jìn)冰箱");
           [subscriber sendCompleted];
           return nil;
       }];
    }] then:^RACSignal *{
        return [RACSignal createSignal:^RACDisposable *(idsubscriber) {
            NSLog(@"關(guān)上冰箱門(mén)");
            [subscriber sendCompleted];
            return nil;
        }];
    }] subscribeCompleted:^{
        NSLog(@"把大象塞進(jìn)冰箱了");
    }];
2015-08-16 20:45:27.724 Test[1334:37870] 打開(kāi)冰箱門(mén)  
2015-08-16 20:45:27.725 Test[1334:37870] 把大象塞進(jìn)冰箱  
2015-08-16 20:45:27.725 Test[1334:37870] 關(guān)上冰箱門(mén)  
2015-08-16 20:45:27.726 Test[1334:37870] 把大象塞進(jìn)冰箱了

命令

我命令你馬上投降。

    RACCommand *aCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
       return [RACSignal createSignal:^RACDisposable *(idsubscriber) {
           NSLog(@"我投降了");
           [subscriber sendCompleted];
           return nil;
       }];
    }];
    [aCommand execute:nil];
2015-08-16 20:54:32.492 Test[1450:41849] 我投降了

延遲

等等我,我還有10秒鐘就到了。

    [[[RACSignal createSignal:^RACDisposable *(idsubscriber) {
        NSLog(@"等等我,我還有10秒鐘就到了");
        [subscriber sendNext:nil];
        [subscriber sendCompleted];
        return nil;
    }] delay:10] subscribeNext:^(id x) {
        NSLog(@"我到了");
    }];
2015-08-16 21:00:57.622 Test[1619:45924] 等等我,我還有10秒鐘就到了  
2015-08-16 21:01:07.624 Test[1619:45924] 我到了

重放

一次制作,多次觀看。

    RACSignal *replaySignal = [[RACSignal createSignal:^RACDisposable *(idsubscriber) {
        NSLog(@"大導(dǎo)演拍了一部電影《我的男票是程序員》");
        [subscriber sendNext:@"《我的男票是程序員》"];
        return nil;
    }] replay];
    [replaySignal subscribeNext:^(id x) {
        NSLog(@"小明看了%@", x);
    }];
    [replaySignal subscribeNext:^(id x) {
        NSLog(@"小紅也看了%@", x);
    }];
2015-08-16 21:18:38.002 Test[1854:54712] 大導(dǎo)演拍了一部電影《我的男票是程序員》  
2015-08-16 21:18:38.004 Test[1854:54712] 小明看了《我的男票是程序員》  
2015-08-16 21:18:38.004 Test[1854:54712] 小紅也看了《我的男票是程序員》

定時(shí)

每隔8個(gè)小時(shí)服一次藥。

    [[RACSignal interval:60*60*8 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(id x) {
        NSLog(@"吃藥");
    }];

超時(shí)

等了你一個(gè)小時(shí)了,你還沒(méi)來(lái),我走了。

    [[[RACSignal createSignal:^RACDisposable *(idsubscriber) {
        [[[RACSignal createSignal:^RACDisposable *(idsubscriber) {
            NSLog(@"我快到了");
            [subscriber sendNext:nil];
            [subscriber sendCompleted];
            return nil;
        }] delay:60*70] subscribeNext:^(id x) {
            [subscriber sendNext:nil];
            [subscriber sendCompleted];
        }];
        return nil;
    }] timeout:60*60 onScheduler:[RACScheduler mainThreadScheduler]] subscribeError:^(NSError *error) {
        NSLog(@"等了你一個(gè)小時(shí)了,你還沒(méi)來(lái),我走了");
    }];
2015-08-16 21:40:09.068 Test[2041:64720] 我快到了  
2015-08-16 22:40:10.048 Test[2041:64720] 等了你一個(gè)小時(shí)了,你還沒(méi)來(lái),我走了

重試

成功之前可能需要數(shù)百次失敗。

    __block int failedCount = 0;
    [[[RACSignal createSignal:^RACDisposable *(idsubscriber) {
        if (failedCount < 100) {
            failedCount++;
            NSLog(@"我失敗了");
            [subscriber sendError:nil];
        }else{
            NSLog(@"經(jīng)歷了數(shù)百次失敗后");
            [subscriber sendNext:nil];
        }
        return nil;
    }] retry] subscribeNext:^(id x) {
        NSLog(@"終于成功了");
    }];
2015-08-16 21:59:07.159 Test[2411:77080] 我失敗了  
2015-08-16 21:59:07.159 Test[2411:77080] 我失敗了  
2015-08-16 21:59:07.159 Test[2411:77080] 我失敗了  
2015-08-16 21:59:07.159 Test[2411:77080] 我失敗了  
2015-08-16 21:59:07.160 Test[2411:77080] 我失敗了  
2015-08-16 21:59:07.160 Test[2411:77080] 我失敗了  
2015-08-16 21:59:07.161 Test[2411:77080] 我失敗了  
2015-08-16 21:59:07.162 Test[2411:77080] 我失敗了  
...
2015-08-16 21:59:07.162 Test[2411:77080] 我失敗了  
2015-08-16 21:59:07.163 Test[2411:77080] 我失敗了  
2015-08-16 21:59:07.163 Test[2411:77080] 我失敗了  
2015-08-16 21:59:07.163 Test[2411:77080] 我失敗了  
2015-08-16 21:59:07.164 Test[2411:77080] 我失敗了  
2015-08-16 21:59:07.164 Test[2411:77080] 我失敗了  
2015-08-16 21:59:07.164 Test[2411:77080] 我失敗了  
2015-08-16 21:59:07.165 Test[2411:77080] 經(jīng)歷了數(shù)百次失敗后  
2015-08-16 21:59:07.165 Test[2411:77080] 終于成功了

節(jié)流

不好意思,這里一秒鐘只能通過(guò)一個(gè)人。

    [[[RACSignal createSignal:^RACDisposable *(idsubscriber) {
        [subscriber sendNext:@"旅客A"];
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [subscriber sendNext:@"旅客B"];
        });
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [subscriber sendNext:@"旅客C"];
            [subscriber sendNext:@"旅客D"];
            [subscriber sendNext:@"旅客E"];
        });
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [subscriber sendNext:@"旅客F"];
        });
        return nil;
    }] throttle:1] subscribeNext:^(id x) {
        NSLog(@"%@通過(guò)了",x);
    }];
2015-08-16 22:08:45.677 Test[2618:83764] 旅客A  
2015-08-16 22:08:46.737 Test[2618:83764] 旅客B  
2015-08-16 22:08:47.822 Test[2618:83764] 旅客E  
2015-08-16 22:08:48.920 Test[2618:83764] 旅客F

條件

直到世界的盡頭才能把我們分開(kāi)。

    [[[RACSignal createSignal:^RACDisposable *(idsubscriber) {
        [[RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(id x) {
            [subscriber sendNext:@"直到世界的盡頭才能把我們分開(kāi)"];
        }];
        return nil;
    }] takeUntil:[RACSignal createSignal:^RACDisposable *(idsubscriber) {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            NSLog(@"世界的盡頭到了");
            [subscriber sendNext:@"世界的盡頭到了"];
        });
        return nil;
    }]] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
2015-08-16 22:17:22.648 Test[2766:88737] 直到世界的盡頭才能把我們分開(kāi)  
2015-08-16 22:17:23.648 Test[2766:88737] 直到世界的盡頭才能把我們分開(kāi)  
2015-08-16 22:17:24.645 Test[2766:88737] 直到世界的盡頭才能把我們分開(kāi)  
2015-08-16 22:17:25.648 Test[2766:88737] 直到世界的盡頭才能把我們分開(kāi)  
2015-08-16 22:17:26.644 Test[2766:88737] 直到世界的盡頭才能把我們分開(kāi)  
2015-08-16 22:17:26.645 Test[2766:88737] 世界的盡頭到了

完事

ReactiveCocoa是如此優(yōu)雅,一旦使用,根本停不下來(lái),上面也只是它的一角冰山,但愿我能挑起你的興趣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評(píng)論 6 534
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,656評(píng)論 3 419
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,697評(píng)論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,098評(píng)論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,855評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,254評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評(píng)論 3 442
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,473評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,014評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,833評(píng)論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,016評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,273評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,680評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,946評(píng)論 1 288
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,730評(píng)論 3 393
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,006評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容

  • 我個(gè)人非常推崇ReactiveCocoa,它就像中國(guó)的太極,太極生兩儀,兩儀生四象,四象生八卦,八卦生萬(wàn)物。Rea...
    liuyun333閱讀 359評(píng)論 0 0
  • 注意: 此文只是自己翻譯學(xué)習(xí),如有不對(duì)地方還望指出。此文結(jié)合如下倆篇文章翻譯,一則練習(xí)自己的翻譯能力,二則真正理解...
    暮落晨曦閱讀 6,361評(píng)論 8 81
  • 有目標(biāo)又有動(dòng)力的人生機(jī)勃勃。當(dāng)所做的一切感受不到其中的樂(lè)趣,負(fù)重就太多,精神疲憊,身體懈怠。 第三篇學(xué)的多,...
    想飛的懶懶貓閱讀 136評(píng)論 0 0
  • 年后換了一份工作,加入了一家新加坡的公司,剛轉(zhuǎn)電商,理由很簡(jiǎn)單【離商業(yè)近點(diǎn)兒,弄明白電商如何掙錢(qián)】 公司現(xiàn)階段主要...
    KeyCheung閱讀 314評(píng)論 0 2
  • in pycharm, even if you name the init as Init, it will st...
    AtrributeError閱讀 133評(píng)論 0 0