如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用?

【編者按】本篇文章作者是Reinder de Vries炸宵,既是一名企業(yè)家辟躏,也是優(yōu)秀的程序員,發(fā)表多篇應(yīng)用程序的博客焙压。本篇文章中鸿脓,作者主要介紹了如何基于Parse特點(diǎn),打造一款類似Instagram的應(yīng)用涯曲,完整而清晰的步驟野哭,為開發(fā)者提供一次絕佳的學(xué)習(xí)體驗(yàn)。本文系 OneAPM 工程師編譯整理幻件。

Parse 是一個移動應(yīng)用開發(fā)平臺拨黔,旗下有個很有意思的產(chǎn)品:Parse Core。它的特色之一是允許應(yīng)用開發(fā)者直接將數(shù)據(jù)存儲在云端绰沥,而無需擔(dān)心設(shè)置服務(wù)器或重新設(shè)計(jì)一個 REST API篱蝇。Parse Core 是本地備份(比如核心數(shù)據(jù))贺待,這使得它能輕松解決線上線下等后端問題。

如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用零截?
如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用麸塞?

本篇教程主要介紹如何創(chuàng)建一個基于 Parse 的應(yīng)用。我們將打造一個類似 Instagram 的應(yīng)用涧衙,它包括以下特征:

  1. 從 Parse 加載數(shù)據(jù)哪工,存儲在本地;
  2. 保存數(shù)據(jù)到 Parse弧哎,并寫回云端雁比;
  3. 為 Cat 的圖片點(diǎn)贊。

這款應(yīng)用將完全使用 Swift 語言開發(fā)撤嫩,Swift 是蘋果最新的編程語言偎捎,用于打造 iOS 應(yīng)用。Parse 并不用完全重寫 Swift序攘,所以我們需要創(chuàng)建一個橋接頭來處理它倆的兼容性茴她。

通過這篇文章你將學(xué)到以下技能:

  • 用 Parse 實(shí)現(xiàn)檢索,存儲數(shù)據(jù)到云端两踏;
  • Cocoapods 整合一個調(diào)用 Objective-C 框架的 Swfit 程序败京;
  • 建立視圖和有接口的自定義表視圖單元;
  • 從零開始梦染,用 Swift 編寫一個完整的 App;
  • 使用自動布局和約束朴皆;
  • 使用手勢識別帕识、可選類型、條件遂铡、閉包肮疗、屬性、出口和動作扒接。

那開始吧伪货!

首先,你得有一個 Parse 帳戶钾怔。這可以通過你的 Facebook碱呼、Google+、GitHub 帳號或郵件在 Parse.com 注冊宗侦。
然后愚臀,登錄 Parse,通過 https://www.parse.com/apps 可以到你的 apps Dashboard矾利。

通過點(diǎn)擊「創(chuàng)建新應(yīng)用」 按鈕姑裂,創(chuàng)建一個新的應(yīng)用程序馋袜,輸入「Paws」作為應(yīng)用名。接著舶斧,打開新應(yīng)用欣鳖,確保你能看到下圖的的核心選項(xiàng)卡。

如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用茴厉?
如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用泽台?

創(chuàng)建數(shù)據(jù)存儲區(qū)

從技術(shù)上說,Parse 只是在線數(shù)據(jù)庫呀忧。數(shù)據(jù)被存儲為具有一個名稱和多個字段的對象师痕,如電子表格。這樣的對象被稱為一個類而账,它的功能是數(shù)據(jù)結(jié)構(gòu)的藍(lán)圖胰坟。我們將要使用的類名為 Cat。

在核心選項(xiàng)卡單擊該按鈕添加一個類泞辐。在下拉框中選擇自定義笔横,然后鍵入類的名稱:Cat。然后咐吼,單擊創(chuàng)建類吹缔。

Imgur
Imgur

這樣,我們就創(chuàng)建了新的類锯茄,接著我們還可以添加一系列的標(biāo)準(zhǔn)字段厢塘,如 ObjectId、createdAt肌幽、updatedat和ACL晚碾。

+Col按鈕翻到最上,添加下列字段喂急,名稱和類型:

  • Name: name, type: String.
  • votes, type Number.
  • url, type String.
  • cc_by, type String.

這些字段將為 Cat 數(shù)據(jù)庫提供基本信息格嘁。

導(dǎo)入數(shù)據(jù)

現(xiàn)在我們已經(jīng)設(shè)置好基礎(chǔ)結(jié)構(gòu),可以導(dǎo)入數(shù)據(jù)了廊移!將該文件保存到:cat.json糕簿。
然后,回到核心選項(xiàng)卡和數(shù)據(jù)庫狡孔,左鍵點(diǎn)擊「導(dǎo)入」按鈕懂诗。選中你剛保存的文件并上傳。確保類別集是「自定義」 步氏,并重命名為 Cat(而不是rs1_cat)响禽。再單擊「完成導(dǎo)入」。如果導(dǎo)入是完整的,Parse 會及時提示芋类。點(diǎn)擊「Got it」并重新加載頁面隆嗅。
如果一切順利,你現(xiàn)在應(yīng)該能看到數(shù)據(jù)庫中有10個 Cat侯繁。它們都有一個名字胖喳、一個 URL、一些得票數(shù)和一些為原則這預(yù)留的空間贮竟。

如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用丽焊?
如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用?

至此咕别,我們在 Parse 中的全部工作已經(jīng)完成技健。下面開始構(gòu)建 Swift Xcode 程序。

構(gòu)建 Xcode

打開 Xcode 并創(chuàng)建一個新項(xiàng)目惰拱,從開始界面選擇「菜單→新建→工程」雌贱。
選擇類別「iOS→應(yīng)用模板」的單一視圖的應(yīng)用。在下一屏上輸入以下字段:

  • 產(chǎn)品名稱:Paws
  • 結(jié)構(gòu)名稱:隨意
  • 結(jié)構(gòu)標(biāo)識符:隨意偿短,比如com.appcoda
  • 語言:Swift
  • 設(shè)備:通用

單擊「下一步」 欣孤,選擇工程目錄文件夾,再單擊「創(chuàng)建」 昔逗。

我們不打算使用 Storyboards降传,所以單擊左上的 Paws、2 targets勾怒、 iOS SDK婆排,打開工程設(shè)置。在左側(cè)的列表中單擊 Target 下方的 Paws笔链,然后找到屏幕中主區(qū)域的主界面設(shè)置泽论。將 textMain 從框中移除。

如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用卡乾?
如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用?

用 Cocoapods 將 Parse 庫添加到 Xcode 項(xiàng)目

在程序代碼中使用 Parse 之前缚够,我們必須將其添加依賴關(guān)系幔妨。因此我們選擇 Cocoapods,它是一個軟件包管理器谍椅。許多應(yīng)用項(xiàng)目依賴于第三方庫误堡,比如 Parse。CocoaPods 是方便加載庫的工具雏吭,并確保其實(shí)時更新锁施。
在終端執(zhí)行以下命令安裝 Cocoapods。它會要求你輸入你的 Mac 用戶密碼。但不允許包含「$」符號悉抵。這標(biāo)志意味著 shell 命令肩狂!

$ sudo gem install cocoapods

中途如果一兩分鐘沒有進(jìn)展也無需擔(dān)心,那是因?yàn)?Cocoapods 正在安裝中姥饰。安裝完成后你可以看到一堆線條傻谁,最終...安裝完成。

如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用列粪?
如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用审磁?

接下來,在 Xcode 項(xiàng)目的根目錄下創(chuàng)建一個空文件岂座,并調(diào)用 Podfile 文件态蒂。用你喜歡的文本編輯器打開,并粘貼下面代碼到該文件:

pod ‘Parse’, ‘~> 1.7.1′
pod ‘ParseUI’, ‘~> 1.1.3′

Podfile 會告知 Cocoapods 哪些庫是我們需要的费什。這樣的話钾恢,Parse 的版本是1.7.1,而ParseUI版本是1.1.3吕喘。
現(xiàn)在赘那,關(guān)閉 Xcode,并使用終端找到程序項(xiàng)目的根目錄氯质。寫入終端 cd募舟,然后在 Paws 目錄中查找,并將其拖至終端闻察。

接下來拱礁,在命令行輸入以下代碼:

$ pod install

CocoaPods 會查找 Podfile,并嘗試安裝我們設(shè)置的依賴關(guān)系辕漂。這個步驟大概會花上幾分鐘呢灶。結(jié)果應(yīng)該是這樣:

如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用?
如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用钉嘹?

CocoaPods 已經(jīng)下載并編譯 Parse鸯乃,并把它添加到一個新的工作區(qū)。從現(xiàn)在開始跋涣,我們不再使用原來的應(yīng)用項(xiàng)目缨睡,而會使用 CocoaPods 創(chuàng)建的工作區(qū)。它包含了我們的原始項(xiàng)目和 CocoaPods 項(xiàng)目陈辱。

這里要注意的是:通過搜索瀏覽找到程序的根目錄奖年,打開 Xcode 中的新工作區(qū),再打開其中的 Paws.xcworkspace沛贪。驗(yàn)證下左側(cè)的導(dǎo)航項(xiàng)目陋守,會看到:Pods 和 Paws震贵。

在我們直接編寫應(yīng)用前,需要建立 Parse 和項(xiàng)目之間的連接水评。Parse 是用 Objective-C 搭建的猩系,而我們的項(xiàng)目則是用 Swift 語言,兩者之間需要適當(dāng)?shù)脑O(shè)置才能兼容之碗。

在 Swift 項(xiàng)目中使用 Objective-C

任何 Objective-C 庫蝙眶、項(xiàng)目或類都可以通過設(shè)置橋接頭才能與 Swift 兼容。從技術(shù)上講褪那,這樣的橋接將 Objective-C 的頭文件轉(zhuǎn)換成 Swift 語言幽纷。

創(chuàng)建一個橋接頭需要執(zhí)行以下操作:

1.在 Paws 目錄添加一個新文件,選擇 Paws 工程下的 Paws 目錄博敬,單擊右鍵友浸,然后單擊「新建文件」。
2.從「iOS→源」類別中選擇Objective-C文件模板并單擊「下一步」偏窝。
3.將類命名為「Paws」(或其它你喜歡的名字)收恢,然后繼續(xù)進(jìn)行并保存文件。出現(xiàn)提示時祭往,單擊「是」來配置 Objective-C 橋接頭伦意。

如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用?
如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用硼补?

Xcode 創(chuàng)建兩個新文件:Paws.m 和 Paws-Bridging-Header.h驮肉。Paws.m 文件沒什么用,你可以直接將它刪除已骇。在 Paws-Bridging-Header.h 文件中寫入以下代碼:

#import <Parse/Parse.h>
#import <ParseUI/ParseUI.h>
#import <Bolts/Bolts.h>

看到這里离钝,你不禁會問難道這一大堆工作只是為了建立一個編程項(xiàng)目么?別擔(dān)心褪储,我們接下來就來搞點(diǎn)有趣的卵渴。請記住:Parse 提供一個現(xiàn)成的在線后端鲤竹,能節(jié)省大量時間浪读!

驗(yàn)證 Parse 是如何工作的

通過 https://parse.com/apps,返回 Parse 的 Dashboard辛藻。將鼠標(biāo)懸停在你帳戶名的右上角瑟啃,單擊帳戶,再單擊應(yīng)用鍵標(biāo)簽最上面一欄揩尸。你還可以直接訪問 https://parse.com/account/keys
確定應(yīng)用的 Parse 網(wǎng)絡(luò)服務(wù)后屁奏,該頁面將顯示你的應(yīng)用鍵岩榆。應(yīng)用鍵由一串字母數(shù)字或字符組成,基本上這就是應(yīng)用的密碼,要注意保密勇边。
接下來犹撒,在 Xcode 中打開文件 AppDelegate.swift。找到應(yīng)用程序的 didFinishLaunchingWithOptions 方法粒褒。
添加以下代碼到方法中识颊,確保它在該方法的首行。完整的是這樣:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool  
{
    Parse.setApplicationId("...", clientKey: "...")

return true  
}

用 Parse 的應(yīng)用鍵分別替換「...」

  1. 第一個奕坟,應(yīng)用 ID
  2. 第二個祥款,客戶端密鑰

之后,嘗試運(yùn)行應(yīng)用程序:

1.確保選擇正確的設(shè)備月杉,通過確認(rèn)PLAY按鈕的右上方刃跛,確保設(shè)備選擇,比如 iPhone 或 iPhone6苛萎。
2.然后桨昙,點(diǎn)擊Play按鈕或按下 Command-R 運(yùn)行程序。

項(xiàng)目在構(gòu)造腌歉、運(yùn)行過程中沒有錯誤蛙酪。一旦運(yùn)行,你可以看到 iPhone 會出現(xiàn)有一個黑色的窗口翘盖,但窗口上卻什么都沒有——這是因?yàn)槲覀円瞥酥黜撁婺_本桂塞,還沒有替換。
值得高興的是:你已經(jīng)成功用 Parse 和 CocoaPods 配置好你的項(xiàng)目了最仑!

創(chuàng)建表視圖控制器

為了顯示出 Paws 應(yīng)用中的 Cat 圖片藐俺,我們需要使用一個表視圖控制器。這是非常常見的 iOS 接口元件泥彤,能在垂直列表中展示各行數(shù)據(jù)欲芹。顯而易見的例子就是 iPhone 上的聯(lián)系人應(yīng)用中人和號碼的垂直列表。在 Objective-C 和 Swift 中吟吝,一個表視圖控制器本身就是 UITableViewController 類菱父。

注:陌生的術(shù)語類?把它當(dāng)作原型剑逃,也就是你在鐵鑄件時用的模具浙宜。你把鐵倒入模具,就出來一個副本蛹磺。這種復(fù)制被稱作該類的一個實(shí)例粟瞬。

Parse 有個很棒的對應(yīng)叫 ParseUI,是 UI 元素集合萤捆,能與 Parse 產(chǎn)品緊密結(jié)合裙品。我們即將使用 PFQueryTableViewController 類俗批。它用 Parse 數(shù)據(jù)擴(kuò)展 UITableViewController 類的功能。這簡直是完美的結(jié)合市怎。
創(chuàng)建一個名為 catstableviewcontroller 的 Swift 新類岁忘。在項(xiàng)目瀏覽器中,右鍵單擊 Paws 目錄并選擇新文件区匠。從「iOS→源」干像,選擇 Cocoa Touch 類模板。輸入以下設(shè)置:

  • 類:CatsTableViewController
  • 繼承:PFQueryTableViewControlle
  • 語言:Swift
  • 確保創(chuàng)建 XIB 文件處于未選中狀態(tài)
如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用驰弄?
如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用麻汰?

保存文件到 Paws 目錄。選擇目錄時揩懒,請確保 Paws 作為目標(biāo)被選中什乙。

打開新類文件,可以看到的基本結(jié)構(gòu):一個名為 viewDidLoad已球;另一個名為 didReceiveMemoryWarning臣镣。需要注意的是,CatsTableViewController 擴(kuò)展 PFQueryTableViewController智亮,是它的子類忆某。反過來,PFQueryTableViewController 類是 UITableViewController 的擴(kuò)展阔蛉,所以我們的表視圖控制器將繼承所有表視圖功能弃舒,同時可用 ParseUI 添加代碼和功能。

編碼表視圖控制器

首先状原,我們必須重寫類的構(gòu)造方法來配置基礎(chǔ)設(shè)置聋呢。

將以下兩種方法添加到類的頂部,在文件的第一個大括號之后:

override init(style: UITableViewStyle, className: String!)  
{
    super.init(style: style, className: className)

    self.pullToRefreshEnabled = true 
    self.paginationEnabled = false  
    self.objectsPerPage = 25

    self.parseClassName = className  
}

required init(coder aDecoder:NSCoder)  
{
    fatalError("NSCoding not supported")  
}

你剛添加了兩個方法:

  • 指定初始化的 init颠区,這需要兩個參數(shù):表視圖的風(fēng)格和我們要使用的 Parse 類名(在這里是 C)
  • 必需的初始化削锰,需要一個參數(shù):NSCoder 的一個實(shí)例。現(xiàn)在為止毕莱,它的內(nèi)容是不相關(guān)的器贩,堅(jiān)持做下去,但不要求你創(chuàng)造性地使用該方法朋截。

在最初的初始化中蛹稍,完成了下列事項(xiàng):

1.當(dāng) super.init()調(diào)用時,初始化父類 PFQueryTableViewController部服,從而完成自身初始化唆姐。
2.接著,pullToRefreshEnabled 設(shè)置為 true廓八,繼承 PFQueryTableViewController 類厦酬。特殊變量 self 指當(dāng)前作用域胆描,為該類的實(shí)例。
3.隨后仗阅,我們禁用分頁,并設(shè)置表對象的最大數(shù)目為25国夜。
4.最后减噪,在實(shí)例屬性 parseClassName 中存儲參數(shù) className。
之后车吹,當(dāng)我們創(chuàng)建 CatsTableViewController 類的實(shí)例筹裕,這個構(gòu)造(或指定初始化)將是表示圖控制器被調(diào)用和設(shè)置的基礎(chǔ)。

用 queryForTable 編碼數(shù)據(jù)檢索

通過 PFQueryTableViewController 實(shí)現(xiàn) Parse 表視圖的核心是方法 queryForTable窄驹。我們繼承該方法時朝卒,繼承的實(shí)際上是 PFQueryTableViewController,所以需要對其進(jìn)行重寫:需要連接表視圖控制器到 Parse 數(shù)據(jù)存儲區(qū)時乐埠,PFQueryTableViewController 會調(diào)用它抗斤。它從表中查詢數(shù)據(jù),因此該方法名為 queryForTable丈咐。在該方法中瑞眼,我們可以自定義檢索。
添加此方法到 CatsTableViewController 類(在 viewDidLoad 方法下)棵逊。注意這些括號匹配伤疙!

override func queryForTable() -> PFQuery {
    var query:PFQuery = PFQuery(className:self.parseClassName!)

    if(objects?.count == 0)
    {
        query.cachePolicy = PFCachePolicy.CacheThenNetwork
    }

    query.orderByAscending("name")

    return query
}

來看看這個新方法:

override func queryForTable() -> PFQuery

其中包含了什么?編寫新方法 queryForTable辆影,告知編譯器以下事項(xiàng):

1.用相同的名字覆蓋父類方法(識別標(biāo)志)徒像,使用語句覆蓋。
用 func 和名字聲明該方法蛙讥,queryfortable锯蛀。
2.聲明 methsignatureod 之間的參數(shù)。本例中沒有參數(shù)键菱。
3.最后選擇「Write→ PFQuery」谬墙,返回方法類型。

在方法內(nèi)發(fā)生了下列變化:

1.聲明一個新變量調(diào)用查詢经备,需要一個命名參數(shù)的類名拭抬,用于實(shí)例化構(gòu)造函數(shù)的方法,被分配的 self.parseclassname 值侵蒙。換句話說造虎,表的類名是 Cat,利用 Cat 實(shí)例創(chuàng)建查詢纷闺。
2.然后算凿,如果查詢是空份蝴,在查詢中設(shè)置 CachePolicy 屬性。它的值是連續(xù)的 PFCachePolicy.CacheThenNetwork氓轰,這意味著該查詢婚夫,首先在脫機(jī)緩存中尋找對象,如果沒有找到署鸡,它會從在線 Parse 數(shù)據(jù)存儲中下載對象案糙。當(dāng)表視圖終于顯示在應(yīng)用界面上,這時 if 語句便成功執(zhí)行靴庆。
3.然后时捌,我們以「名稱」列為查詢對象。

最后炉抒,返回查詢結(jié)果奢讨。(未完待續(xù)...)

敬請持續(xù)關(guān)注:《如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應(yīng)用》系列(2)(3).

原文地址:Building an Instagram-Like App with Parse and Swift

本文系 OneAPM 工程師編譯整理。OneAPM 是應(yīng)用性能管理領(lǐng)域的新興領(lǐng)軍企業(yè)焰薄,能幫助企業(yè)用戶和開發(fā)者輕松實(shí)現(xiàn):緩慢的程序代碼和 SQL 語句的實(shí)時抓取拿诸。想閱讀更多技術(shù)文章,請?jiān)L問 OneAPM 官方博客蛤奥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末佳镜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖泌类,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異啊掏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)衰猛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門迟蜜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人啡省,你說我怎么就攤上這事娜睛。” “怎么了卦睹?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵畦戒,是天一觀的道長。 經(jīng)常有香客問我结序,道長障斋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮垃环,結(jié)果婚禮上邀层,老公的妹妹穿的比我還像新娘。我一直安慰自己遂庄,他們只是感情好寥院,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涛目,像睡著了一般只磷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泌绣,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機(jī)與錄音预厌,去河邊找鬼阿迈。 笑死,一個胖子當(dāng)著我的面吹牛轧叽,可吹牛的內(nèi)容都是我干的苗沧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼炭晒,長吁一口氣:“原來是場噩夢啊……” “哼待逞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起网严,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤识樱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后震束,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怜庸,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年垢村,在試婚紗的時候發(fā)現(xiàn)自己被綠了割疾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡嘉栓,死狀恐怖宏榕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侵佃,我是刑警寧澤麻昼,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站趣钱,受9級特大地震影響涌献,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜首有,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一燕垃、第九天 我趴在偏房一處隱蔽的房頂上張望枢劝。 院中可真熱鬧,春花似錦卜壕、人聲如沸您旁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鹤盒。三九已至,卻和暖如春侦副,著一層夾襖步出監(jiān)牢的瞬間侦锯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工秦驯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尺碰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓译隘,卻偏偏與公主長得像亲桥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子固耘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

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