記一次iOS重構(gòu)之路

新入職了被盈,前一個(gè)月陸陸續(xù)續(xù)把之前一個(gè)App重構(gòu)了一下下炸枣,目前重構(gòu)了一半,基本架構(gòu)算是弄完了民镜,先總結(jié)下啡专,后面接著完善。
分以下說(shuō)明下:

1: 為什么要重構(gòu)
2:重構(gòu)前的準(zhǔn)備工作
3:重構(gòu)之路

1:為什么要重構(gòu)
1.1 代碼層面

首先看到我司這個(gè)新的App之前寫(xiě)的代碼制圈,是用 MVC模式寫(xiě)的植旧,但是發(fā)現(xiàn)一個(gè)類(lèi)里面尤其是viewcontroller寫(xiě)了幾百行代碼,有的都是一千多行,我熟悉起來(lái)感覺(jué)好累离唐,其次模塊架構(gòu)分的還是不夠清晰病附,有些業(yè)務(wù)邏輯放到了其他模塊里面,沒(méi)有單獨(dú)拆分出來(lái)亥鬓。最后感覺(jué)里面冗余了很多無(wú)用的代碼完沪。當(dāng)然了我的吐槽并不是說(shuō)我自己多牛,其實(shí)我也只是個(gè)菜鳥(niǎo)嵌戈,只是希望重構(gòu)一下方便后續(xù)維護(hù)覆积。

1.2 個(gè)人原因

因?yàn)槲抑岸际亲鯯DK開(kāi)發(fā),很久沒(méi)有單獨(dú)開(kāi)發(fā)App了熟呛,并且之前的公司代碼全部都是模塊化管理宽档,我們現(xiàn)在這個(gè)完整的App卻是耦合性很高,加之我反復(fù)熟悉了我司之前的這個(gè)App業(yè)務(wù)邏輯庵朝,前段時(shí)間也比較空閑吗冤,于是就決定重構(gòu)一下。


2.重構(gòu)前的準(zhǔn)備工作

根據(jù)我之前的經(jīng)驗(yàn)九府,我希望這個(gè)App模塊化椎瘟,耦合性盡量低一些。

2.1 設(shè)計(jì)模式的轉(zhuǎn)變

我準(zhǔn)備從之前的單純mvc設(shè)計(jì)模式轉(zhuǎn)變成MVVM With ReactiveCocoa設(shè)計(jì)模式,
MVVM的使用我參考了以下文章侄旬,供大家參考:
iOS 關(guān)于MVC和MVVM設(shè)計(jì)模式的那些事
對(duì)于結(jié)合使用ReactiveCocoa,我覺(jué)得可以更加方便view層和ViewModel層之間的交互肺蔚,并且ReactiveCocoa為事件提供了很多處理方法,而且利用RAC處理事件很方便儡羔,可以把要處理的事情宣羊,和監(jiān)聽(tīng)的事情的代碼放在一起,這樣非常方便我們管理汰蜘,就不需要跳到對(duì)應(yīng)的方法里仇冯。非常符合我們開(kāi)發(fā)中高聚合,低耦合的思想鉴扫。對(duì)于它的使用我參考了一下文章:
最快讓你上手ReactiveCocoa之基礎(chǔ)篇
ReactiveCocoa 中 RACSignal 是如何發(fā)送信號(hào)的

2.2 組件化改造

組件化我直接使用CasaiOS應(yīng)用架構(gòu)談 組件化方案,簡(jiǎn)單來(lái)說(shuō)基于casa的 CTMediator
組件架構(gòu)內(nèi)部調(diào)用部分
通過(guò)Target+Action以及組件+類(lèi)別的調(diào)用方式組成一個(gè)中介者模式
赞枕。
原因很簡(jiǎn)單我之前的公司就是使用這一套架構(gòu),我覺(jué)得還不錯(cuò)坪创,我這邊就接著借鑒使用了炕婶。
其實(shí)組件化有很多方案,強(qiáng)烈推薦可以參考這篇文章

部分目錄截圖


3.重構(gòu)之路
3.1項(xiàng)目結(jié)構(gòu)整理

首先大概看下這個(gè)App結(jié)構(gòu)

效果圖

從這個(gè)效果圖上面我先總結(jié)了重構(gòu)該項(xiàng)目大概所需要的組件


3.2 MVVM+RAC項(xiàng)目重構(gòu)開(kāi)始
  • 之前項(xiàng)目中全部是本地文件放到具體項(xiàng)目中莱预,沒(méi)有使用cooapods柠掂,我們代碼目前還是托管到svn上。我想進(jìn)行模塊化依沮,每個(gè)不同功能的組件都能進(jìn)行cocoapods管理涯贞,考慮到代碼私有化,我暫時(shí)沒(méi)有將要重構(gòu)的代碼托管到第三方的git倉(cāng)庫(kù)上危喉,先將代碼放到本地指定文件下宋渔,每個(gè)模塊也加入podspec文件,通過(guò)引用本地路徑辜限,同樣也能實(shí)現(xiàn)cocoaPods管理皇拣,每個(gè)模塊文件都可以pod下載管理。
    使用本地cocapods管理之后薄嫡,podfie文件里面管理大概就是類(lèi)似下面這個(gè)模塊了:


    這樣重構(gòu)的項(xiàng)目模塊依賴(lài)只需要管理對(duì)應(yīng)的podfile文件就好了氧急。

  • 由于資訊列表頁(yè)面就是請(qǐng)求數(shù)據(jù)和解析相關(guān)數(shù)據(jù),無(wú)需其他業(yè)務(wù)邏輯毫深,首先我重構(gòu)該模塊吩坝。


    資訊

就以這個(gè)模塊為例說(shuō)明下:

  • 使用MVVM我們離不開(kāi)ViewViewModel哑蔫,Controller钉寝,
    這里先統(tǒng)一定義下baseViewbaseViewModel闸迷,baseController瘩蚪,

首先建立BaseViewmodel,遵循BaseViewModelProtocol協(xié)議。

@protocol PLBaseViewModelProtocol <NSObject>

@optional

@property (nonatomic, readonly, copy) NSDictionary *params;
@property (nonatomic, readonly, copy) NSString *title;
//error接受者
@property (nonatomic, readonly, strong) RACSubject *errors;

- (instancetype)initWithParams:(NSDictionary *)params;

- (void)initialize;

@end

所有的viewmodel都要繼承它BaseViewmodel稿黍。
BaseViewmodel里面結(jié)構(gòu)如下:

19E6100E-64A2-432C-871A-AB7F8B0ED60D.png

通過(guò)- (instancetype)initWithParams:(NSDictionary *)params方法傳遞進(jìn)來(lái)一些基本參數(shù)提供給Viewmodel使用,在initialize方法里面子類(lèi)里面放些需要初始化的操作疹瘦。
建立PLBaseView,遵循PLBaseViewProtocol,所有直接繼承UIView類(lèi)型的view都要繼承它,其他view比如tableViewcell遵循PLBaseViewProtocol

@protocol PLBaseViewProtocol <NSObject>

@optional

@property (nonatomic, strong, readonly) PLBaseViewModel *viewModel;

- (instancetype)initWithViewModel:(PLBaseViewModel *)viewModel;

- (void)renderViews;

- (void)bindViewModel:(id)viewModel;

- (void)bindViewModel;

@end
@implementation PLBaseView

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    PLBaseView *view = [super allocWithZone:zone];
    @weakify(view)
    [[view rac_signalForSelector:@selector(initWithViewModel:)] subscribeNext:^(RACTuple * _Nullable x) {
        @strongify(view)
        [view renderViews];
        [view bindViewModel];
    }];
    
    return view;
}

- (instancetype)initWithViewModel:(PLBaseViewModel *)viewModel {
    if (self = [super init]) {
        _viewModel = viewModel;
    }
    return self;
}
//配置子視圖的操作放在這個(gè)地方
- (void)renderViews {
    
}
//與viewModel的具體交互操作
- (void)bindViewModel {
    
}

- (void)bindViewModel:(id)viewModel {
    _viewModel = viewModel;
}

建立baseControllerView,其實(shí)這個(gè)類(lèi)里面類(lèi)容和baseView里面類(lèi)似巡球,綁定viewModel

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    PLModelViewController *viewController = [super allocWithZone: zone];
    @weakify(viewController)
    [[viewController rac_signalForSelector:@selector(viewDidLoad)] subscribeNext:^(RACTuple * _Nullable x) {
        @strongify(viewController)
        [viewController bindViewModel];
    }];
    return viewController;
}

- (instancetype)initWithViewModel:(PLBaseViewModel *)viewModel {
    if (self = [super init]) {
        self.viewModel = viewModel;
    }
    return self;
}
//通過(guò)RAC進(jìn)行title綁定操作
- (void)bindViewModel {
    RAC(self,title) = RACObserve(self, viewModel.title);
    //訂閱信號(hào)
    [self.viewModel.errors subscribeNext:^(NSError *error) {
        NSLog(@"viewModel 錯(cuò)誤信息------%@",error);
    }];
}

還有在通過(guò)繼承baseViewControllerbaseView分別針對(duì)tabelView做了進(jìn)一步處理言沐,新建類(lèi)PLBaseTableViewController,PLBaseTableViewModel,這里代碼代碼就不在詳細(xì)贅述。
PLBaseTableViewModel主要做了如下額外處理:

PLBaseTableViewModel.h

PLBaseTableViewController主要做了如下處理酣栈,主要添加了tabelView,集成了MJRefresh下拉刷新和上拉加載功能.
PLBaseTableViewController.h

  • 建立UITableViewDataSource的代理類(lèi)TabelViewArrayDataSource,
    UITableViewDataSource相關(guān)代理方法分離出去
    TabelViewArrayDataSource

這樣的好處就是避免使用tabelveVIew的時(shí)候還導(dǎo)入UITableViewDataSource,降低了代碼的耦合性险胰。


上面主要的基類(lèi)創(chuàng)建完成,就可以開(kāi)始使用MVVM+RAC正式開(kāi)始構(gòu)建業(yè)務(wù)相關(guān)頁(yè)面了矿筝。

  • 針對(duì)資訊新聞列表頁(yè)面創(chuàng)建FitfunInfoListViewModel,繼承于PLBaseTableViewModel,所有的網(wǎng)絡(luò)交換和數(shù)據(jù)獲取都是放在viewModel中的起便。這里簡(jiǎn)單說(shuō)下:
    .h文件
@class FitfunBannerModel;

@interface FitfunInfoListViewModel : PLBaseTableViewModel

//滾動(dòng)視圖數(shù)據(jù)源
@property (nonatomic, readonly, strong) NSArray <FitfunBannerModel *> *banners;
//請(qǐng)求banner數(shù)據(jù)命令
@property (nonatomic, readonly, strong) RACCommand *requestBannerDataCommand;
@end

主要就是通過(guò)RAC信號(hào)源來(lái)進(jìn)行數(shù)據(jù)交換和傳遞
.m文件里面主要用到了RAC的RACCommand

E147CEE2-5AC9-40E8-ABA5-6976245D6A62.png

RACCommand:RAC中用于處理事件的類(lèi),可以把事件如何處理,事件中的數(shù)據(jù)如何傳遞榆综,包裝到這個(gè)類(lèi)中妙痹,他可以很方便的監(jiān)控事件的執(zhí)行過(guò)程。具體使用不熟悉的可以參考上面【設(shè)計(jì)模式的轉(zhuǎn)變】我分享RAC學(xué)習(xí)的鏈接鼻疮。
使用場(chǎng)景:監(jiān)聽(tīng)按鈕點(diǎn)擊怯伊,網(wǎng)絡(luò)請(qǐng)求

網(wǎng)絡(luò)請(qǐng)求方面我還進(jìn)行了解耦。

使用的是casa的那一套iOS應(yīng)用架構(gòu)談 網(wǎng)絡(luò)層設(shè)計(jì)方案,簡(jiǎn)單來(lái)說(shuō)是使用CTNetworking判沟,網(wǎng)絡(luò)層上部分使用離散型設(shè)計(jì)耿芹,下部分使用集約型設(shè)計(jì),使用delegate來(lái)做數(shù)據(jù)對(duì)接挪哄,僅在必要時(shí)采用Notification來(lái)做跨層訪問(wèn)吧秕,設(shè)計(jì)合理的繼承機(jī)制,讓派生出來(lái)的APIManager受到限制迹炼。這個(gè)具體有興趣了解的話·請(qǐng)看上面共享的鏈接砸彬。
FitfunInfoListViewModel.m文件里面我具體的體現(xiàn)是遵循CTAPIManagerParamSource,CTAPIManagerCallBackDelegate協(xié)議,然后再對(duì)應(yīng)協(xié)議里面?zhèn)鬟f需要的參數(shù)和相應(yīng)對(duì)應(yīng)的請(qǐng)求結(jié)果疗涉。進(jìn)行網(wǎng)絡(luò)請(qǐng)求就需要我們繼承CTAPIBaseManager,里面設(shè)置一些網(wǎng)絡(luò)請(qǐng)求相關(guān)操作拿霉□尾妫看下里面我寫(xiě)的大致代碼:

#pragma mark - CTAPIManagerParamSource
//這里放額外拼接的參數(shù)
- (NSDictionary *)paramsForApi:(CTAPIBaseManager *)manager {
    NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];
    if (manager == self.bannerImageAPIManager) {
        dic[@"id"] = (self.params[@"bannerID"]?:@"");
    } 
    return dic;
}

#pragma mark -CTAPIManagerCallBackDelegate
//這里網(wǎng)絡(luò)請(qǐng)求成功的相關(guān)操作
- (void)managerCallAPIDidSuccess:(CTAPIBaseManager *)manager {
   
}
//網(wǎng)絡(luò)請(qǐng)求失敗相關(guān)操作
- (void)managerCallAPIDidFailed:(CTAPIBaseManager *)manager{
  
}

#pragma mark - getter&&setter

//繼承于CTAPIBaseManager迎捺,這里配置網(wǎng)絡(luò)請(qǐng)求地址和請(qǐng)求類(lèi)型
- (FitfunAPIBaseManager *)topicInfoAPIManager {
    if (!_topicInfoAPIManager) {
        _topicInfoAPIManager = [[FitfunAPIBaseManager alloc] initWithMethodName:front_content_list reuquest:CTAPIManagerRequestTypePost];
        _topicInfoAPIManager.paramSource = self;
        _topicInfoAPIManager.delegate = self;
    }
    return _topicInfoAPIManager;
}
//reformer遵循`CTAPIManagerDataReformer`,用來(lái)統(tǒng)一解析網(wǎng)絡(luò)請(qǐng)求成功數(shù)據(jù)
- (FitfunAPIBaseDataReformer *)reformer {
    if (!_reformer) {
        _reformer = [[FitfunAPIBaseDataReformer alloc]init];
    }
    return _reformer;
}

資訊的新聞列表的ViewModel寫(xiě)完了,就可以新建ViewFitfunInfoListTableViewCell,遵循PLBaseViewProtocol協(xié)議,
view里面主要就是進(jìn)行視圖搭建和解析ViewModel相關(guān)操作测萎,這里直接跳過(guò)闹伪。
然后新建新聞列表的FitfunInfoViewController繼承于PLBaseTableViewController,通過(guò)FitfunInfoListViewModel進(jìn)行數(shù)據(jù)關(guān)聯(lián)沪铭,RAC進(jìn)行數(shù)據(jù)傳遞,最后我們的新聞列表Controller里面結(jié)構(gòu)和代碼就會(huì)特別清爽偏瓤。
我只需要在綁定的ViewModel對(duì)應(yīng)的數(shù)據(jù)監(jiān)聽(tīng)方法中操作就ok了杀怠。

FitfunInfoViewController部分ViewModel處理代碼

大致重構(gòu)項(xiàng)目使用MVVM+RAC的簡(jiǎn)單說(shuō)明就是這樣了,
重新調(diào)整了下結(jié)構(gòu)厅克,使業(yè)務(wù)處理邏輯更加清晰赔退,代碼結(jié)構(gòu)慢慢趨于完善。
為了更直觀看出代碼的變化我們可以對(duì)比下新聞列表頁(yè)構(gòu)造前后代碼的變化和調(diào)整:

之前新聞列表構(gòu)造

初步改造之后
3.3 AppDelegate解耦

初步改造之后证舟,然后看了下之前項(xiàng)目里面AppDelegate各種注冊(cè)和事件處理硕旗,Appdelegate.m代碼冗余度太高了。于是考慮到如何將Appdelegate解耦下女责。綜合之前工作經(jīng)驗(yàn)和網(wǎng)上別人說(shuō)的漆枚,我總結(jié)了目前有大致如下幾種解耦方式:

  • 第一個(gè)當(dāng)然使我們最熟悉的使用AppDelegate 分類(lèi) (Category)
    創(chuàng)建 AppDelegate 分類(lèi)無(wú)疑是低投入高產(chǎn)出的最好解決方案了

  • FRDModuleManager,FRDModuleManager 是豆瓣開(kāi)源的輕量級(jí)模塊管理工具,其內(nèi)部數(shù)組持有注冊(cè)的模塊的引用抵知,通過(guò)依次調(diào)用數(shù)組中的每個(gè)模塊的特定方法來(lái)達(dá)到解耦的目的.

  • JSDecoupledAppDelegate,通過(guò)轉(zhuǎn)發(fā) AppDelegate 的各個(gè)方法來(lái)實(shí)現(xiàn) AppDelegate 的解耦的:

  • JLRoutes
    MGJRouter
    靈活的 iOS URL Router,由于這個(gè)我沒(méi)有用過(guò)墙基,不是很熟悉软族,感興趣可自尋了解下

這里還增加兩個(gè)我之前公司用到的另外兩個(gè)解耦方法

  • Aspects,一個(gè)輕量級(jí)的面向切面編程的庫(kù)。它能允許你在每一個(gè)類(lèi)和每一個(gè)實(shí)例中存在的方法里面加入任何代碼,通過(guò)Runtime消息轉(zhuǎn)發(fā)實(shí)現(xiàn)Hook,我們可以使用它在各個(gè)類(lèi)里面攔截AppDelegate的各個(gè)方法残制。這個(gè)代碼完全無(wú)侵入立砸,之前公司一直在用,使用過(guò)程中就是偶爾會(huì)發(fā)生莫名的攔截錯(cuò)誤痘拆。還不錯(cuò)仰禽,感興趣的可參考大神的iOS 如何實(shí)現(xiàn)Aspect Oriented Programming

  • BeeHive,BeeHive是阿里用于iOS的App模塊化編程的框架實(shí)現(xiàn)方案氮墨,吸收了Spring框架Service的理念來(lái)實(shí)現(xiàn)模塊間的API耦合纺蛆。我之前公司用于游戲代理層方面的解耦,使用起來(lái)非常不錯(cuò)的一個(gè)框架规揪。如果對(duì)這個(gè)框架感興趣桥氏,可以參考大神關(guān)于這個(gè)框架源碼解析BeeHive —— 一個(gè)優(yōu)雅但還在完善中的解耦框架

我這個(gè)項(xiàng)目中考慮了一下,我重構(gòu)的項(xiàng)目目前不是很大猛铅,在Appdelegate對(duì)應(yīng)方法里面注冊(cè)的類(lèi)相對(duì)有限字支,我想在各個(gè)類(lèi)里面對(duì)應(yīng)響應(yīng)UIApplicationDelegate協(xié)議方法,為了簡(jiǎn)單化一些暫時(shí)參考了FRDModuleManager奸忽,在這個(gè)基礎(chǔ)上簡(jiǎn)單改造了成了PLModuleManager堕伪,使用時(shí)需要在Appdelegate.m使用PLModuleManager注冊(cè)相關(guān)方法,在PLModuleManager初始化時(shí)候持有需要注冊(cè)類(lèi)栗菜,而注冊(cè)過(guò)的類(lèi)遵循UIApplicationDelegateUNUserNotificationCenterDelegate協(xié)議欠雌,實(shí)現(xiàn)需要的協(xié)議方法即可。


后續(xù)代碼調(diào)整和總結(jié):

初步重構(gòu)項(xiàng)目的架構(gòu)就是那樣了疙筹,后面還需要做的就是

  • 把原來(lái)項(xiàng)目中到處隨意使用的通知NSNotificationCenter全部替換掉富俄,用blockdelegate等形式。亂用通知會(huì)導(dǎo)致代碼不可控而咆,管理性極差霍比。
  • 代碼格式統(tǒng)一規(guī)范,代碼風(fēng)格要按照標(biāo)準(zhǔn)書(shū)寫(xiě)暴备,自己現(xiàn)在重構(gòu)的項(xiàng)目偷懶寫(xiě)的一些不合理的地方也得糾正過(guò)來(lái)悠瞬。還有盡量使用代碼構(gòu)建視圖,代替之前項(xiàng)目中大量使用xib,xib的過(guò)多使用會(huì)導(dǎo)致代碼不好維護(hù)涯捻,尤其后面多人維護(hù)的時(shí)候浅妆。
  • 把iOS環(huán)信通信這塊代碼重新整合一下,還有對(duì)現(xiàn)在對(duì)MVVM+RAC的使用不夠熟練汰瘫,這一塊有時(shí)間重新優(yōu)化改造下狂打。
  • 其他的暫時(shí)沒(méi)有想到的等以后想起來(lái)或發(fā)現(xiàn)糾正。

疏漏和不合理之處如果各位哥哥姐姐們看到了混弥,請(qǐng)不吝賜教趴乡,我只是按照自己的思路簡(jiǎn)單初步總結(jié)了下后續(xù)重構(gòu)完畢這部分文章重新再整理下.

如果有需要对省,可參考我根據(jù)上面思路初步寫(xiě)的Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晾捏,隨后出現(xiàn)的幾起案子蒿涎,更是在濱河造成了極大的恐慌,老刑警劉巖惦辛,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劳秋,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡胖齐,警方通過(guò)查閱死者的電腦和手機(jī)玻淑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)呀伙,“玉大人补履,你說(shuō)我怎么就攤上這事〗肆恚” “怎么了箫锤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)雨女。 經(jīng)常有香客問(wèn)我谚攒,道長(zhǎng),這世上最難降的妖魔是什么氛堕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任馏臭,我火速辦了婚禮,結(jié)果婚禮上岔擂,老公的妹妹穿的比我還像新娘位喂。我一直安慰自己,他們只是感情好乱灵,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布塑崖。 她就那樣靜靜地躺著,像睡著了一般痛倚。 火紅的嫁衣襯著肌膚如雪规婆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天蝉稳,我揣著相機(jī)與錄音抒蚜,去河邊找鬼。 笑死耘戚,一個(gè)胖子當(dāng)著我的面吹牛嗡髓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播收津,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼饿这,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼浊伙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起长捧,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嚣鄙,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后串结,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體哑子,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年肌割,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卧蜓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡声功,死狀恐怖烦却,靈堂內(nèi)的尸體忽然破棺而出宠叼,到底是詐尸還是另有隱情先巴,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布冒冬,位于F島的核電站伸蚯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏简烤。R本人自食惡果不足惜剂邮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望横侦。 院中可真熱鬧挥萌,春花似錦、人聲如沸枉侧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)榨馁。三九已至憨栽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翼虫,已是汗流浹背屑柔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留珍剑,地道東北人掸宛。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像招拙,于是被迫代替她去往敵國(guó)和親唧瘾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子翔曲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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

  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱(chēng)項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,969評(píng)論 3 119
  • 秦家有女名素荷劈愚, 生有七竅玲瓏心瞳遍, 琴棋書(shū)畫(huà)樣樣通, 必是帝王將相家菌羽。 秦家的二女兒一出生就注定了此生不凡掠械,更是被...
    北不歸閱讀 517評(píng)論 0 2
  • 插序 今天的我,偶然間聽(tīng)到一個(gè)故事注祖,女孩的媽媽自小遭受最親的人欺負(fù)猾蒂。自此,女孩的媽媽從小留下心理陰影是晨,慢慢地肚菠,她變...
    hsisbwkiwhbs閱讀 253評(píng)論 0 0
  • 我們正為生活疲于奔命的時(shí)候箫章,生活已經(jīng)離我們遠(yuǎn)去烙荷。——約翰·列儂 【1】 不知道大家有沒(méi)有這樣的感覺(jué):這個(gè)時(shí)代崇尚速...
    青貓醬閱讀 310評(píng)論 0 2
  • 特別喜歡一部小說(shuō)《微微一笑很傾城》,不單羨慕貝微微和肖奈甜到發(fā)齁的愛(ài)情桶至,更羨慕微微昼伴,二喜,曉玲镣屹,絲絲那濃濃的舍友情...
    圓圓的桃子閱讀 765評(píng)論 0 1