與網(wǎng)絡(luò)相關(guān)的幾個(gè)重要的類(一) —— NSURLSession(一)

版本記錄

版本號 時(shí)間
V1.0 2018.01.09

前言

APP都需要與服務(wù)器進(jìn)行數(shù)據(jù)交互冠蒋,極個(gè)別的除外羽圃,比如簡單的相機(jī),計(jì)算器等等抖剿,不需要登錄和服務(wù)端存儲信息的APP朽寞,絕大多數(shù)都是需要和服務(wù)器進(jìn)行交互的,那就需要用到網(wǎng)絡(luò)斩郎,接下來幾篇就講述一下與網(wǎng)絡(luò)相關(guān)的幾個(gè)類脑融。

Overview

該類作用是用來協(xié)調(diào)一組相關(guān)網(wǎng)絡(luò)數(shù)據(jù)傳輸任務(wù)的對象。

NSURLSession類和相關(guān)類提供了用于下載內(nèi)容的API缩宜。 此API提供了一組豐富的委托方法來支持身份驗(yàn)證肘迎,并使您的應(yīng)用能夠在應(yīng)用未運(yùn)行時(shí)或者暫停應(yīng)用時(shí)執(zhí)行后臺下載。

NSURLSession類本地支持data锻煌,file妓布,ftphttphttps URL schemes宋梧,透明地支持代理proxy服務(wù)器和SOCKS網(wǎng)關(guān)匣沼,如用戶系統(tǒng)偏好設(shè)置中配置的那樣。

NSURLSession支持HTTP / 1.1捂龄,SPDYHTTP / 2協(xié)議释涛。 HTTP / 2支持由RFC 7540描述加叁,并需要支持ALPNNPN的服務(wù)器進(jìn)行協(xié)議協(xié)商。

您還可以使用NSURLProtocol添加對自己的自定義網(wǎng)絡(luò)協(xié)議和URL scheme的支持(用于您的app的私人使用)唇撬。

注意:NSURLSession API涉及許多不同的類以相當(dāng)復(fù)雜的方式一起工作它匕,如果您閱讀參考文檔,則這些類可能并不明顯窖认。 在使用這個(gè)API之前豫柬,你應(yīng)該閱讀 URL Session Programming Guide以便了解這些類如何相互交互。

使用NSURLSession API耀态,您的app會創(chuàng)建一個(gè)或多個(gè)會話轮傍,每個(gè)會話都會協(xié)調(diào)一組相關(guān)的數(shù)據(jù)傳輸任務(wù)暂雹。 例如首装,如果您正在創(chuàng)建Web瀏覽器,則您的應(yīng)用程序可以為每個(gè)tab或window創(chuàng)建一個(gè)會話杭跪,或者一個(gè)會話用于交互式使用仙逻,另一個(gè)用于后臺下載。 在每個(gè)會話中涧尿,您的應(yīng)用程序會添加一系列任務(wù)系奉,其中每個(gè)任務(wù)代表對特定URL的請求(如果需要,請?jiān)?code>HTTP redirects之后)姑廉。

給定的URL會話中的任務(wù)共享一個(gè)公共的會話配置對象session configuration object缺亮,該對象定義了連接行為,例如要對單個(gè)host進(jìn)行的同時(shí)連接的最大數(shù)量桥言,是否允許通過蜂窩網(wǎng)絡(luò)的連接等等萌踱。 會話的行為部分由您在創(chuàng)建配置對象時(shí)調(diào)用的方法決定:

  • 單利共享會話singleton shared session(沒有配置對象)用于基本請求。 它不像您創(chuàng)建的會話那樣具有可定制性号阿,但是如果您的要求非常有限并鸵,則它是一個(gè)很好的起點(diǎn)。 您可以通過調(diào)用sharedSession類方法來訪問此會話扔涧。 有關(guān)其局限性的更多信息园担,請參閱該方法的討論。

  • 默認(rèn)會話Default sessions的行為與共享會話singleton shared session非常相似(除非您進(jìn)一步自定義)枯夜,但是可以使用代理逐步獲取數(shù)據(jù)弯汰。 您可以通過調(diào)用NSURLSessionConfiguration類的defaultSessionConfiguration方法來創(chuàng)建默認(rèn)的會話配置湖雹。

  • 臨時(shí)會話Ephemeral sessions與默認(rèn)會話default sessions類似蝙泼,但不會將緩存cache,Cookiecredentials寫入磁盤劝枣。 您可以通過調(diào)用NSURLSessionConfiguration類上的 ephemeralSessionConfiguration方法來創(chuàng)建臨時(shí)會話配置汤踏。

  • 后臺會話Background sessions允許您在應(yīng)用程序未運(yùn)行時(shí)在后臺執(zhí)行上傳和下載內(nèi)容织鲸。 您可以通過調(diào)用NSURLSessionConfigurationbackgroundSessionConfiguration:方法來創(chuàng)建后臺會話配置。

會話配置session configuration對象還包含對URL緩存和Cookie存儲對象的引用溪胶,這些對象可能在發(fā)出請求和處理響應(yīng)時(shí)使用搂擦,具體取決于配置和請求類型。

會話中的任務(wù)還共享一個(gè)通用代理哗脖,以便在發(fā)生各種事件時(shí)提供和獲取信息 - 當(dāng)身份驗(yàn)證失敗時(shí)瀑踢,當(dāng)數(shù)據(jù)從服務(wù)器到達(dá)時(shí),當(dāng)數(shù)據(jù)準(zhǔn)備好被緩存時(shí)等等才避。 Using a URL Session一步一步地列出了會話執(zhí)行任務(wù)時(shí)發(fā)生的事件橱夭,以及作為結(jié)果調(diào)用哪個(gè)代理方法。

另一方面桑逝,如果您不需要代理提供的任何功能棘劣,則可以在創(chuàng)建會話時(shí)通過傳遞nil來使用此API,而無需提供此功能楞遏。

重要:會話對象保持對代理的強(qiáng)引用茬暇,直到你的應(yīng)用程序退出或顯式使會話無效。 如果您不會使會話無效寡喝,那么您的應(yīng)用程序會泄漏內(nèi)存糙俗,直到退出。

在會話中预鬓,您可以創(chuàng)建任務(wù)巧骚,可選地將數(shù)據(jù)上載到服務(wù)器,然后從服務(wù)器檢索數(shù)據(jù)(作為磁盤上的文件或內(nèi)存中的一個(gè)或多個(gè)NSData對象)格二。 NSURLSession API提供了三種類型的任務(wù):

  • Data tasks劈彪,數(shù)據(jù)任務(wù)使用NSData對象發(fā)送和接收數(shù)據(jù)。 數(shù)據(jù)任務(wù)旨在用于對服務(wù)器進(jìn)行簡短的交互式請求蟋定。

  • Upload tasks粉臊,上傳任務(wù)與數(shù)據(jù)任務(wù)類似,但也會發(fā)送數(shù)據(jù)(通常以文件的形式)驶兜,并在應(yīng)用程序未運(yùn)行時(shí)支持后臺上傳扼仲。

  • Download tasks,下載任務(wù)以文件的形式檢索數(shù)據(jù)抄淑,并在應(yīng)用程序不運(yùn)行時(shí)支持后臺下載和上傳屠凶,。

像大多數(shù)網(wǎng)絡(luò)API一樣肆资,NSURLSession API是高度異步的矗愧。 它以兩種方式之一將數(shù)據(jù)返回到您的應(yīng)用程序,具體取決于您調(diào)用的方法:

  • 當(dāng)傳輸成功完成或發(fā)生錯(cuò)誤時(shí)郑原,通過調(diào)用完成處理程序塊唉韭。

  • 當(dāng)數(shù)據(jù)被接收并且傳輸完成時(shí)夜涕,通過在會話的代理中調(diào)用方法。

除了將這些信息傳遞給代理属愤,NSURLSession API還提供狀態(tài)status和進(jìn)度progress屬性女器,如果需要根據(jù)任務(wù)的當(dāng)前狀態(tài)做出編程決定(可以隨時(shí)改變狀態(tài)),可以查詢狀態(tài)和進(jìn)度屬性住诸。

URL會話還支持取消驾胆,重新啟動或恢復(fù)以及暫停任務(wù),并提供恢復(fù)暫停贱呐,取消或失敗下載的功能丧诺。


Related Classes - 相關(guān)的類

NSURLSession API使用許多類,這些類也常用于其他API奄薇,例如NSURLConnectionNSURLDownload驳阎。 其中一些共享類包括:

  • NSURL - 包含URL的一個(gè)對象。
  • NSURLRequest - 封裝與URL請求有關(guān)的元數(shù)據(jù)惕艳,包括URL搞隐,請求方法等等驹愚。
  • NSURLResponse - 封裝與服務(wù)器對請求的響應(yīng)相關(guān)的元數(shù)據(jù)远搪,例如內(nèi)容MIME類型和長度。
  • NSHTTPURLResponse - 添加特定于HTTP請求的元數(shù)據(jù)逢捺,例如響應(yīng)頭谁鳍。
  • NSCachedURLResponse - 封裝URL響應(yīng)對象,以及服務(wù)器響應(yīng)的實(shí)際主體數(shù)據(jù)劫瞳,以進(jìn)行緩存倘潜。

App Transport Security (ATS)

iOS 9.0OS X 10.11開始,對于使用NSURLSession進(jìn)行的所有HTTP連接志于,默認(rèn)啟用稱為App Transport Security(ATS)的新安全功能涮因。 ATS要求HTTP連接使用HTTPS(RFC 2818)。


Using a URL Session - 使用URL會話

使用NSURLSession類發(fā)出請求

    1. 創(chuàng)建會話配置伺绽。 對于后臺會話养泡,此配置必須包含唯一標(biāo)識符。 存儲該標(biāo)識符奈应,并在應(yīng)用程序崩潰或終止或掛起時(shí)使用該標(biāo)識符與會話重新關(guān)聯(lián)澜掩。
    1. 創(chuàng)建一個(gè)會話,指定一個(gè)配置對象杖挣,還可以指定一個(gè)代理肩榕。
    1. 在會話中創(chuàng)建任務(wù)代表資源請求的任務(wù)對象。 這些任務(wù)對象是NSURLSessionTask—— NSURLSessionDataTask惩妇, NSURLSessionUploadTaskNSURLSessionDownloadTask的子類株汉,具體取決于您嘗試實(shí)現(xiàn)的行為筐乳。 每個(gè)任務(wù)都以暫停suspended狀態(tài)啟動。 在您的應(yīng)用程序調(diào)用恢復(fù)resume任務(wù)后乔妈,它開始下載指定的資源哥童。

在你開始一個(gè)任務(wù)之后,會話在它的代理上調(diào)用方法

    1. 如果與服務(wù)器的初始握手需要連接級別的挑戰(zhàn)(如SSL客戶端證書)褒翰,則NSURLSession將調(diào)用URLSession:task:didReceiveChallenge:completionHandler:URLSession:didReceiveChallenge:completionHandler:代理方法贮懈。
    1. 如果任務(wù)的數(shù)據(jù)是從流中提供的,則NSURLSession對象將調(diào)用代理的 URLSession:task:needNewBodyStream:方法來獲取為新請求提供主體數(shù)據(jù)的NSInputStream實(shí)例优训。
    1. 在將主體內(nèi)容初始上傳到服務(wù)器(如果適用)期間朵你,代理會定期接收URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:回調(diào),報(bào)告上傳進(jìn)度揣非。
    1. 服務(wù)器發(fā)送一個(gè)響應(yīng)抡医。
    1. 如果響應(yīng)表明需要身份驗(yàn)證,則會話將調(diào)用其代理的 URLSession:task:didReceiveChallenge:completionHandler:方法早敬。 回到步驟2忌傻。
    1. 如果響應(yīng)是HTTP重定向響應(yīng),則NSURLSession對象將調(diào)用代理的URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:方法搞监。 該代理方法使用提供的NSURLRequest對象(遵循重定向)水孩,新的NSURLRequest對象(重定向到不同的URL)或nil(將重定向的響應(yīng)主體視為有效的響應(yīng)并將其返回)調(diào)用提供的完成處理程序作為結(jié)果)。
      1)如果您決定遵循重定向琐驴,請返回步驟2俘种。
      2)如果委托沒有實(shí)現(xiàn)此方法,則重定向的跟隨次數(shù)達(dá)到最大重定向次數(shù)绝淡。
    1. 對于通過調(diào)用downloadTaskWithResumeData:
      downloadTaskWithResumeData:completionHandler:創(chuàng)建的下載(或重新下載)任務(wù)宙刘,NSURLSession使用新的任務(wù)對象調(diào)用代理的 URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:方法。
    1. 對于數(shù)據(jù)任務(wù)牢酵,NSURLSession對象調(diào)用代理的URLSession:dataTask:didReceiveResponse:completionHandler:方法悬包。 決定是否將數(shù)據(jù)任務(wù)轉(zhuǎn)換為下載任務(wù),然后調(diào)用完成處理程序以轉(zhuǎn)換馍乙,繼續(xù)或取消任務(wù)布近。 如果您的app選擇將數(shù)據(jù)任務(wù)轉(zhuǎn)換為下載任務(wù),則NSURLSession將新下載任務(wù)作為參數(shù)調(diào)用代理的URLSession:dataTask:didBecomeDownloadTask:方法潘拨。 在這個(gè)調(diào)用之后吊输,代理不會收到來自數(shù)據(jù)任務(wù)的進(jìn)一步回調(diào),并開始接收來自下載任務(wù)的回調(diào)。
    1. 在從服務(wù)器傳輸?shù)倪^程中,代理會定期收到一個(gè)任務(wù)級回調(diào)拥坛,以報(bào)告?zhèn)鬏斶M(jìn)度枉氮。 對于數(shù)據(jù)任務(wù)抹锄,會話會在接收到實(shí)際的數(shù)據(jù)段時(shí)調(diào)用委托的 URLSession:dataTask:didReceiveData:方法西剥。 對于下載任務(wù)糠雨,會話調(diào)用代理的 URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:方法的成功寫入磁盤的字節(jié)數(shù)曹货。 如果用戶通知您的app暫停下載料滥,則通過調(diào)用cancelByProducingResumeData:方法取消該任務(wù)然眼。 稍后,如果用戶請求您的應(yīng)用程序繼續(xù)下載葵腹,請將所返回的重啟處數(shù)據(jù)傳遞給downloadTaskWithResumeData:downloadTaskWithResumeData:completionHandler:方法以創(chuàng)建一個(gè)新的下載任務(wù)高每,以繼續(xù)下載。 (轉(zhuǎn)到步驟1)践宴。
    1. 對于數(shù)據(jù)任務(wù)鲸匿,NSURLSession對象可以調(diào)用委托的 URLSession:dataTask:willCacheResponse:completionHandler:方法。 您的應(yīng)用程序應(yīng)該決定是否允許緩存阻肩。 如果您不實(shí)現(xiàn)此方法带欢,則默認(rèn)行為是使用會話的配置對象中指定的緩存策略。
    1. 如果響應(yīng)是多部分編碼的烤惊,則會話可以再次調(diào)用代理的didReceiveResponse方法乔煞,然后再進(jìn)行零次或多次didReceiveData調(diào)用。 如果發(fā)生這種情況柒室,請轉(zhuǎn)到步驟8(處理didReceiveResponse調(diào)用)渡贾。
    1. 如果下載任務(wù)成功完成伦泥,則NSURLSession對象使用臨時(shí)文件的位置調(diào)用任務(wù)的URLSession:downloadTask:didFinishDownloadingToURL:方法刻诊。您的app必須在此代理方法返回之前從此文件讀取響應(yīng)數(shù)據(jù)复局,或者將其移至永久位置亿昏。
    1. 當(dāng)任何任務(wù)完成時(shí)角钩,NSURLSession對象調(diào)用代理的 URLSession:task:didCompleteWithError:方法惨险,返回的為error對象或nil(如果任務(wù)成功完成)恭朗。如果可以恢復(fù)下載任務(wù),則NSError對象的userInfo字典包含NSURLSessionDownloadTaskResumeData鍵的值冀墨。您的app應(yīng)該傳遞此值以調(diào)用downloadTaskWithResumeData:downloadTaskWithResumeData:completionHandler:創(chuàng)建一個(gè)新的下載任務(wù),以繼續(xù)現(xiàn)有的下載睛琳。如果任務(wù)無法恢復(fù)师骗,您的app應(yīng)該創(chuàng)建一個(gè)新的下載任務(wù)并從頭開始重新啟動事務(wù)寡夹。在這兩種情況下,如果傳輸因服務(wù)器錯(cuò)誤以外的任何原因而失敗传于,請轉(zhuǎn)到步驟3(創(chuàng)建和恢復(fù)任務(wù)對象)。
    1. 如果不再需要會話找都,則可以通過調(diào)用invalidateAndCancel(取消未完成的任務(wù))或finishTasksAndInvalidate(以允許未完成的任務(wù)在使對象失效之前完成)來使其無效唇辨。 如果您不會使會話無效,則會在應(yīng)用程序終止時(shí)自動消失(除非是具有活動任務(wù)的后臺會話)能耻。 在使會話無效之后赏枚,當(dāng)所有未完成的任務(wù)被取消或完成時(shí),會話將調(diào)用代理的 URLSession:didBecomeInvalidWithError:方法晓猛。 當(dāng)該代理方法返回時(shí)饿幅,該會話將處理其對代理的強(qiáng)烈引用。

如果您的app取消正在進(jìn)行的下載戒职,則NSURLSession對象會像發(fā)生錯(cuò)誤一樣調(diào)用代理的 URLSession:task:didCompleteWithError:方法栗恩。


NSCopying Behavior - NSCopying行為

會話和任務(wù)對象遵循NSCopying協(xié)議如下:

  • 當(dāng)您的app復(fù)制一個(gè)會話或任務(wù)對象時(shí),你會得到相同的對象洪燥。
  • 當(dāng)您的app復(fù)制一個(gè)配置對象時(shí)磕秤,您會得到一個(gè)您可以獨(dú)立修改的新副本。

Thread Safety - 線程安全

URL會話API本身完全是線程安全的捧韵。 您可以在任何線程上下文中自由創(chuàng)建會話和任務(wù)市咆,并且當(dāng)您的代理方法調(diào)用提供的完成處理程序時(shí),會自動在正確的代理隊(duì)列上調(diào)度工作纫版。

警告:您的 URLSessionDidFinishEventsForBackgroundURLSession:會話代理方法可能會在輔助線程上調(diào)用床绪。 但是,在iOS中其弊,您的該方法的實(shí)現(xiàn)可能需要調(diào)用在您的app中提供給您的完成處理程序: application:handleEventsForBackgroundURLSession:completionHandler:app代理方法。 您必須在主線程上調(diào)用完成處理程序膀斋。


Topics

1. Creating a Session

2. Configuring a Session

  • configuration

    • 此會話的配置對象的副本绩社。
  • delegate

    • 創(chuàng)建此對象時(shí)分配的代理。
  • NSURLSessionDelegate

    • NSURLSessionDelegate協(xié)議描述NSURLSession對象在代理上調(diào)用以處理會話級事件的方法赂苗。
  • NSURLSessionTaskDelegate

    • NSURLSessionTaskDelegate協(xié)議定義了在使用任何類型的NSURLSession任務(wù)時(shí)應(yīng)該實(shí)現(xiàn)的特定于任務(wù)的代理方法愉耙。
  • delegateQueue

    • 此對象創(chuàng)建時(shí)提供的操作隊(duì)列
  • sessionDescription

    • 會話的應(yīng)用程序定義的描述性標(biāo)簽。

3. Adding Data Tasks to a Session

  • - dataTaskWithURL:

    • 創(chuàng)建一個(gè)檢索指定URL內(nèi)容的任務(wù)拌滋。
  • dataTaskWithURL:completionHandler:

    • 創(chuàng)建一個(gè)檢索指定URL內(nèi)容的任務(wù)朴沿,然后在完成時(shí)調(diào)用一個(gè)處理程序。
  • - dataTaskWithRequest:

    • 創(chuàng)建一個(gè)基于指定的URL請求對象檢索URL內(nèi)容的任務(wù)败砂。
  • - dataTaskWithRequest:completionHandler:

    • 創(chuàng)建一個(gè)任務(wù)赌渣,根據(jù)指定的URL請求對象檢索URL的內(nèi)容,并在完成時(shí)調(diào)用處理程序昌犹。
  • NSURLSessionDataTask

    • 將下載的數(shù)據(jù)直接返回到內(nèi)存中的應(yīng)用程序的URL會話任務(wù)坚芜。
  • NSURLSessionDataDelegate

    • NSURLSessionDataDelegate協(xié)議定義了NSURLSession對象的代理可以實(shí)現(xiàn)的方法,以處理特定于數(shù)據(jù)任務(wù)和上傳任務(wù)的任務(wù)級事件斜姥。

4. Adding Download Tasks to a Session

  • downloadTaskWithURL:

    • 創(chuàng)建一個(gè)下載任務(wù)鸿竖,用于檢索指定URL的內(nèi)容并將結(jié)果保存到文件中。
  • - downloadTaskWithURL:completionHandler:

    • 創(chuàng)建一個(gè)下載任務(wù)铸敏,用于檢索指定URL的內(nèi)容千贯,將結(jié)果保存到文件中,并在完成時(shí)調(diào)用處理程序搞坝。
  • - downloadTaskWithRequest:

    • 創(chuàng)建一個(gè)下載任務(wù)搔谴,根據(jù)指定的URL請求對象檢索URL的內(nèi)容,并將結(jié)果保存到文件中桩撮。
  • - downloadTaskWithRequest:completionHandler:

    • 創(chuàng)建一個(gè)下載任務(wù)敦第,根據(jù)指定的URL請求對象檢索URL的內(nèi)容,將結(jié)果保存到文件中店量,并在完成時(shí)調(diào)用處理程序芜果。
  • - downloadTaskWithResumeData:

    • 創(chuàng)建一個(gè)下載任務(wù)恢復(fù)以前取消或失敗的下載。
  • - downloadTaskWithResumeData:completionHandler:

    • 創(chuàng)建一個(gè)下載任務(wù)恢復(fù)以前取消或失敗的下載融师,并在完成后調(diào)用處理程序右钾。
  • NSURLSessionDownloadTask

    • 將會下載的數(shù)據(jù)存儲到文件的URL會話任務(wù)。
  • NSURLSessionDownloadDelegate

    • NSURLSessionDownloadDelegate協(xié)議定義了在使用NSURLSession下載任務(wù)時(shí)應(yīng)該實(shí)現(xiàn)的代理方法旱爆。

5. Adding Upload Tasks to a Session

  • - uploadTaskWithRequest:fromData:

    • 創(chuàng)建一個(gè)對指定的URL請求對象執(zhí)行HTTP請求并上傳提供的數(shù)據(jù)的任務(wù)舀射。
  • - uploadTaskWithRequest:fromData:completionHandler:

    • 創(chuàng)建一個(gè)對指定的URL請求對象執(zhí)行HTTP請求的任務(wù),上傳提供的數(shù)據(jù)怀伦,并在完成時(shí)調(diào)用處理程序脆烟。
  • - uploadTaskWithRequest:fromFile:

    • 創(chuàng)建執(zhí)行HTTP請求以上載指定文件的任務(wù)。
  • uploadTaskWithRequest:fromFile:completionHandler:

    • 創(chuàng)建執(zhí)行HTTP請求以上載指定文件的任務(wù)房待,然后在完成時(shí)調(diào)用處理程序邢羔。
  • - uploadTaskWithStreamedRequest:

    • 創(chuàng)建一個(gè)任務(wù)驼抹,根據(jù)指定的URL請求執(zhí)行HTTP請求以上傳數(shù)據(jù)。
  • NSURLSessionUploadTask

    • 以請求體的形式將數(shù)據(jù)上傳到網(wǎng)絡(luò)的URL會話任務(wù)拜鹤。
  • NSURLSessionDataDelegate

    • NSURLSessionDataDelegate協(xié)議定義了NSURLSession對象的代理可以實(shí)現(xiàn)的方法框冀,以處理特定數(shù)據(jù)任務(wù)和上載任務(wù)的任務(wù)級事件。

6. Adding Stream Tasks to a Session

7. Managing the Session

8. Constants

后記

未完,待續(xù)~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嗅绰,一起剝皮案震驚了整個(gè)濱河市舍肠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窘面,老刑警劉巖翠语,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異民镜,居然都是意外死亡啡专,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門制圈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來们童,“玉大人,你說我怎么就攤上這事鲸鹦』劭猓” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵馋嗜,是天一觀的道長齐板。 經(jīng)常有香客問我,道長葛菇,這世上最難降的妖魔是什么甘磨? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮眯停,結(jié)果婚禮上济舆,老公的妹妹穿的比我還像新娘。我一直安慰自己莺债,他們只是感情好滋觉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著齐邦,像睡著了一般椎侠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上措拇,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天我纪,我揣著相機(jī)與錄音,去河邊找鬼丐吓。 笑死浅悉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的汰蜘。 我是一名探鬼主播仇冯,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼族操!你這毒婦竟也來了苛坚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤色难,失蹤者是張志新(化名)和其女友劉穎泼舱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枷莉,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娇昙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笤妙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冒掌。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡噪裕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出股毫,到底是詐尸還是另有隱情膳音,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布铃诬,位于F島的核電站祭陷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏趣席。R本人自食惡果不足惜兵志,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宣肚。 院中可真熱鬧想罕,春花似錦、人聲如沸钉寝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嵌纲。三九已至俘枫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逮走,已是汗流浹背鸠蚪。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留师溅,地道東北人茅信。 一個(gè)月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像墓臭,于是被迫代替她去往敵國和親蘸鲸。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348

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