最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS 模塊化之JLRoute路由示例

 更新時(shí)間:2018年02月08日 16:16:27   作者:WhatsXie  
這篇文章主要介紹了iOS 模塊化之JLRoute路由示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

JLRoutes是一個(gè)調(diào)用極少代碼 , 可以很方便的處理不同URL schemes以及解析它們的參數(shù),并通過回調(diào)block來處理URL對(duì)應(yīng)的操作 , 可以用于處理復(fù)雜跳轉(zhuǎn)邏輯的三方庫.

1.在日常開發(fā)中 , push , present 出現(xiàn)在整個(gè)程序的各個(gè)地方 , 如果你想快速理清一個(gè)項(xiàng)目的整體邏輯 , 非常麻煩 . 大多數(shù)情況 , 你得找到代碼目錄 ,根據(jù)層級(jí)結(jié)構(gòu)分出關(guān)系 , 然后找到對(duì)應(yīng)的push位置 , 尋找下一級(jí)頁面 , 如果本身項(xiàng)目的目錄就非常亂 , 那么如果要了解一個(gè)項(xiàng)目的整體跳轉(zhuǎn)邏輯 , 非常的難.

即便可以將 UIViewController-Swizzled 庫集成到項(xiàng)目中 ,然后一頁一頁點(diǎn)擊查詢 , 但也是比較痛苦的.

如果 , 是把整個(gè)項(xiàng)目的跳轉(zhuǎn)邏輯都給抽取出來 , 單獨(dú)放在一個(gè)類 , 模塊化管理 , 那么思路就會(huì)清晰很多 , 甚至可以用XMind根據(jù)代碼畫出整個(gè)項(xiàng)目的樹狀圖

2.如果所處公司存在多個(gè)app , app之間互相推薦 , 互相跳轉(zhuǎn)是再正常不過的需求,就類似于QQ , 微信三方分享跳轉(zhuǎn)等 .如果用Appdelegate原生方法進(jìn)行攔截 , 所做的事至少得是判斷Scheme是否匹配 , 想辦法進(jìn)入需要跳到的界面 , 如果要涉及傳參 , 就更加麻煩.

3. 如果用戶是從PC端識(shí)別二維碼,或者通過鏈接想要進(jìn)入app指定頁面

基于 JLRoute 實(shí)現(xiàn)的模塊化示例,包括鏈接跳轉(zhuǎn)原生頁面、WebView頁面和ReactNative頁面

模塊化已經(jīng)成為調(diào)劑龐大項(xiàng)目結(jié)構(gòu)的一劑良藥,對(duì)項(xiàng)目的開發(fā)、維護(hù)和后續(xù)的擴(kuò)展的好處已經(jīng)不言而喻。

要求

  1. iOS 8.0+
  2. Xcode 7.0+

安裝方法

安裝

在 iOS, 你需要在 Podfile 中添加.

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
use_frameworks!

pod 'JLRoutes', '~> 2.0.1'

# 'node_modules'目錄一般位于根目錄中
# 但是如果你的結(jié)構(gòu)不同,那你就要根據(jù)實(shí)際路徑修改下面的`:path`
pod 'React', :path => './node_modules/react-native', :subspecs => [
  'Core',
  'RCTText',
  'RCTNetwork',
  'RCTWebSocket', # 這個(gè)模塊是用于調(diào)試功能的
  # 在這里繼續(xù)添加你所需要的模塊
]
# 如果你的RN版本 >= 0.42.0,請(qǐng)加入下面這行
pod "Yoga", :path => "./node_modules/react-native/ReactCommon/yoga"

啟動(dòng) ReactNative 環(huán)境

1.修改項(xiàng)目ModuleARNPageViewController.m IP 跳轉(zhuǎn)地址

2.進(jìn)入項(xiàng)目所在目錄,運(yùn)行

npm start

JLRoutes的工作流程和原理

單一的Scheme注冊(cè)過程:

1.調(diào)用注冊(cè)方法(用戶注冊(cè)routePattern,默認(rèn)優(yōu)先級(jí)0)

復(fù)制代碼 代碼如下:

- (void)addRoute:(NSString *)routePattern handler:(BOOL (^__nullable)(NSDictionary<NSString *, id> *parameters))handlerBlock;

2.路由解析(這些解析跟我們?cè)O(shè)置路由的規(guī)則有直接關(guān)系)

(1)判斷接口URL是否設(shè)置可選性URL并將對(duì)應(yīng)的URL封裝成JLRRouteDefinition對(duì)象

(2)將JLRRouteDefinition對(duì)象裝載進(jìn)一個(gè)可變數(shù)組,內(nèi)存保留了所有的對(duì)象!!

(JLRRouteDefinition對(duì)象包括有路徑,參數(shù)解析,block等信息)

單一的Scheme調(diào)用過程:

1.調(diào)用URL

+ (BOOL)routeURL:(NSURL *)URL

2.解析URL,將參數(shù),路由信息封裝成JLRRouteRequest對(duì)象

復(fù)制代碼 代碼如下:

- (instancetype)initWithURL:(NSURL *)URL alwaysTreatsHostAsPathComponent:(BOOL)alwaysTreatsHostAsPathComponent

3.給JLrouteRequest對(duì)象和路由數(shù)組里的JLRRouteDefinition對(duì)象作比對(duì),并且返回JLRRouteResponse 對(duì)象抽出參數(shù)和URL在數(shù)組里

復(fù)制代碼 代碼如下:

JLRRouteResponse *response = [route routeResponseForRequest:request decodePlusSymbols:shouldDecodePlusSymbols];

4.調(diào)用JLRRouteResponse 對(duì)象里面的回調(diào)方法

[route callHandlerBlockWithParameters:finalParameters];

JLRoutes的URL注冊(cè)規(guī)則:

1.普通注冊(cè)

JLRoutes *routes = [JLRoutes globalRoutes];
[routes addRoute:@"/user/view/:userID" handler:^BOOL(NSDictionary *parameters) {
NSString *userID = parameters[@"userID"]; // defined in the route by specifying ":userID"
// present UI for viewing user with ID 'userID'
return YES; // return YES to say we have handled the route
}];

URL里,分號(hào)表示這個(gè)是參數(shù)

另外一種注冊(cè)方式,下標(biāo)注冊(cè)法

JLRoutes.globalRoutes[@"/route/:param"] = ^BOOL(NSDictionary *parameters) {
// ...
};

如何按照以上的方式注冊(cè),在任何時(shí)刻(包括在其它的APP)你都可以調(diào)用這個(gè)URL。

NSURL *viewUserURL = [NSURL URLWithString:@"myapp://user/view/joeldev"];
[[UIApplication sharedApplication] openURL:viewUserURL];

在這個(gè)例子中,在parmameters字典里面的userID會(huì)傳給block,它是一個(gè)鍵值對(duì)。”userID”: “joeldev”。給UI層或者任何需要它的地方用的。

字典參數(shù):

字典參數(shù)總包括至少一下3個(gè)鍵:

{
"JLRouteURL": "(the NSURL that caused this block to be fired)",
"JLRoutePattern": "(the actual route pattern string)",
"JLRouteScheme": "(the route scheme, defaults to JLRoutesGlobalRoutesScheme)"
}

處理Block

你會(huì)發(fā)現(xiàn),每個(gè)注冊(cè)的block都會(huì)返回一個(gè)YES。這個(gè)值,如果你返回NO,JLRoutes會(huì)跳過這個(gè)匹配,然后繼續(xù)去匹配其它的。

如果你的block設(shè)置成nil,它會(huì)默認(rèn)返回YES。

2.復(fù)雜注冊(cè)

[[JLRoutes globalRoutes] addRoute:@"/:object/:action/:primaryKey" handler:^BOOL(NSDictionary *parameters) {
NSString *object = parameters[@"object"];
NSString *action = parameters[@"action"];
NSString *primaryKey = parameters[@"primaryKey"];
// stuff
return YES;
}];

這個(gè)地址會(huì)被匹配很多URL,如/user/view/joeldev or /post/edit/123。這些URL上的是參數(shù)。

NSURL *editPost = [NSURL URLWithString:@"myapp://post/edit/123?debug=true&foo=bar"];
[[UIApplication sharedApplication] openURL:editPost];

這時(shí),pramater字典就會(huì)是以下這樣的(傳參)

{
"object": "post",
"action": "edit",
"primaryKey": "123",
"debug": "true",
"foo": "bar",
"JLRouteURL": "myapp://post/edit/123?debug=true&foo=bar",
"JLRoutePattern": "/:object/:action/:primaryKey",
"JLRouteScheme": "JLRoutesGlobalRoutesScheme"
}

3.Scheme(有沒有多態(tài)的感覺)

JLRoutes支持用指定的URL scheme來創(chuàng)建路由。相同的scheme才能被匹配。默認(rèn)地,所有的URL會(huì)設(shè)置進(jìn)global scheme。

[[JLRoutes globalRoutes] addRoute:@"/foo" handler:^BOOL(NSDictionary *parameters) {
// This block is called if the scheme is not 'thing' or 'stuff' (see below)
return YES;
}];
[[JLRoutes routesForScheme:@"thing"] addRoute:@"/foo" handler:^BOOL(NSDictionary *parameters) {
// This block is called for thing://foo
return YES;
}];
[[JLRoutes routesForScheme:@"stuff"] addRoute:@"/foo" handler:^BOOL(NSDictionary *parameters) {
// This block is called for stuff://foo
return YES;
}];
如果你調(diào)用的使用,是這樣調(diào)用的

[[JLRoutes globalRoutes] addRoute:@"/global" handler:^BOOL(NSDictionary *parameters) {
return YES;
}];

它只會(huì)調(diào)用global scheme的對(duì)應(yīng)的URL。不會(huì)調(diào)用ting scheme里面對(duì)應(yīng)的URL。

當(dāng)然,你可以設(shè)置,如果指定的scheme沒有這個(gè)URL,去查詢global scheme 有沒有。你需要設(shè)置一個(gè)屬性。

[JLRoutes routesForScheme:@"thing"].shouldFallbackToGlobalRoutes = YES;

3.通配符的設(shè)置URL的方式

通配符為:*

通配符符后面所有的URL上的參數(shù)都會(huì)以一個(gè)數(shù)組保存在parameters字典里面的JLRouteWildcardComponentsKey對(duì)應(yīng)的value里。

例如,如果你注冊(cè)URL如下:

[[JLRoutes globalRoutes] addRoute:@"/wildcard/*" handler:^BOOL(NSDictionary *parameters) {
NSArray *pathComponents = parameters[JLRouteWildcardComponentsKey];
if ([pathComponents count] > 0 && [pathComponents[0] isEqualToString:@"joker"]) {
// the route matched; do stuff
return YES;
}
// not interested unless the joker's in it
return NO;
}];

如果調(diào)用的URL開始是/wildcard,這個(gè)路由就可能被觸發(fā)??!如果第一個(gè)參數(shù)是joker,就被觸發(fā),如果不是,就被拒絕觸發(fā)。。。

4.選擇性路由

如果路由地址設(shè)置樣式有括號(hào),如:/the(/foo/:a)(/bar/:b),其實(shí)它代表的URL有如下:

/the/foo/:a/bar/:b
/the/foo/:a
/the/bar/:b
/the

5.查詢 Routes

下面的方式,你可以查看Routes里所有注冊(cè)的URL Routes。

/// All registered routes, keyed by scheme
+ (NSDictionary <NSString *, NSArray <JLRRouteDefinition *> *> *)allRoutes;
/// Return all registered routes in the receiving scheme namespace.
- (NSArray <JLRRouteDefinition *> *)routes;

自定義路由解析 如果你想自己定制一個(gè)路由編輯,你可以繼承JLRouteDefinition并且用 addRoute:方法去添加你自定義類的對(duì)象。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • iOS?block的值捕獲與指針捕獲詳解

    iOS?block的值捕獲與指針捕獲詳解

    Block它是C語言級(jí)別和運(yùn)行時(shí)方面的一個(gè)特征,下面這篇文章主要給大家介紹了關(guān)于iOS?block的值捕獲與指針捕獲的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • iOS中NSPredicate謂詞的使用

    iOS中NSPredicate謂詞的使用

    這篇文章主要給大家介紹了關(guān)于iOS中NSPredicate謂詞的使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • ios通過按鈕點(diǎn)擊異步加載圖片

    ios通過按鈕點(diǎn)擊異步加載圖片

    本文給大家匯總了幾種IOS中實(shí)現(xiàn)異步加載圖片的方法,十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。
    2015-05-05
  • iOS仿小紅書呼吸燈動(dòng)畫(核心動(dòng)畫和定時(shí)器)兩種方式實(shí)現(xiàn)

    iOS仿小紅書呼吸燈動(dòng)畫(核心動(dòng)畫和定時(shí)器)兩種方式實(shí)現(xiàn)

    本篇文章主要介紹了iOS仿小紅書呼吸燈動(dòng)畫(核心動(dòng)畫和定時(shí)器)兩種方式實(shí)現(xiàn),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-04-04
  • 詳解iOS App中UITableView的創(chuàng)建與內(nèi)容刷新

    詳解iOS App中UITableView的創(chuàng)建與內(nèi)容刷新

    這篇文章主要介紹了iOS App中UITableView的創(chuàng)建與內(nèi)容刷新,講解了UITableView一些基本的樣式與cell的設(shè)置及刷新,需要的朋友可以參考下
    2016-04-04
  • 淺談iOS應(yīng)用中的相關(guān)正則及驗(yàn)證

    淺談iOS應(yīng)用中的相關(guān)正則及驗(yàn)證

    下面小編就為大家?guī)硪黄獪\談iOS應(yīng)用中的相關(guān)正則及驗(yàn)證。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • 基于IOS實(shí)現(xiàn)帶箭頭的view

    基于IOS實(shí)現(xiàn)帶箭頭的view

    這篇文章封裝了一個(gè)比較常用的控件, 帶箭頭的View, iOS在很多場(chǎng)景下可以使用到帶箭頭的View,下面一起來學(xué)習(xí)學(xué)習(xí)。
    2016-08-08
  • iOS Xcode8更新后輸出log日志關(guān)閉的方法

    iOS Xcode8更新后輸出log日志關(guān)閉的方法

    今天剛把xcode更新到了xcode8,運(yùn)行發(fā)現(xiàn)好多l(xiāng)og輸出,怎么關(guān)閉呢,不是很清楚,通過查閱相關(guān)資料順利關(guān)掉這些log日志,下面小編把方法共享下,需要的朋友參考下
    2016-09-09
  • iOS中 UIImage根據(jù)屏寬調(diào)整size的實(shí)例代碼

    iOS中 UIImage根據(jù)屏寬調(diào)整size的實(shí)例代碼

    最近做項(xiàng)目遇到這樣一個(gè)需求,要求UIImage根據(jù)屏幕寬度按照自己本身比例改變高度,下面通過本文給大家分享iOS UIImage根據(jù)屏寬調(diào)整size的實(shí)例代碼,需要的朋友參考下吧
    2017-01-01
  • IOS開發(fā)-多線程隊(duì)列測(cè)試代碼

    IOS開發(fā)-多線程隊(duì)列測(cè)試代碼

    這篇文章中,我不會(huì)說多線程是什么、線程和進(jìn)程的區(qū)別、多線程有什么用,當(dāng)然我也不會(huì)說什么是串行、什么是并行等問題,這些我們應(yīng)該都知道的。
    2017-09-09

最新評(píng)論

抚顺市| 武夷山市| 繁峙县| 泸州市| 印江| 互助| 榆中县| 西贡区| 达州市| 垣曲县| 盐池县| 井研县| 宁德市| 乌鲁木齐县| 武平县| 镇远县| 布尔津县| 比如县| 安仁县| 泰州市| 千阳县| 修水县| 德令哈市| 简阳市| 台中市| 高雄市| 财经| 绍兴市| 红原县| 巴东县| 福鼎市| 东丰县| 北宁市| 安西县| 阿勒泰市| 独山县| 依兰县| 平阴县| 分宜县| 临潭县| 信宜市|