├── .DS_Store ├── LICENSE ├── PreloadDemo ├── .DS_Store ├── Podfile ├── Podfile.lock ├── Pods │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ ├── project.pbxproj │ │ └── xcuserdata │ │ │ ├── shenjie.xcuserdatad │ │ │ └── xcschemes │ │ │ │ ├── Alamofire.xcscheme │ │ │ │ ├── Kingfisher.xcscheme │ │ │ │ ├── Pods-PreloadDemo.xcscheme │ │ │ │ └── xcschememanagement.plist │ │ │ └── snaigame.xcuserdatad │ │ │ └── xcschemes │ │ │ ├── Pods-PreloadDemo.xcscheme │ │ │ └── xcschememanagement.plist │ └── Target Support Files │ │ └── Pods-PreloadDemo │ │ ├── Pods-PreloadDemo-Info.plist │ │ ├── Pods-PreloadDemo-acknowledgements.markdown │ │ ├── Pods-PreloadDemo-acknowledgements.plist │ │ ├── Pods-PreloadDemo-dummy.m │ │ ├── Pods-PreloadDemo-frameworks-Debug-input-files.xcfilelist │ │ ├── Pods-PreloadDemo-frameworks-Debug-output-files.xcfilelist │ │ ├── Pods-PreloadDemo-frameworks-Release-input-files.xcfilelist │ │ ├── Pods-PreloadDemo-frameworks-Release-output-files.xcfilelist │ │ ├── Pods-PreloadDemo-frameworks.sh │ │ ├── Pods-PreloadDemo-umbrella.h │ │ ├── Pods-PreloadDemo.debug.xcconfig │ │ ├── Pods-PreloadDemo.modulemap │ │ └── Pods-PreloadDemo.release.xcconfig ├── PreloadDemo.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ ├── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ │ └── xcuserdata │ │ │ ├── shenjie.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ │ │ └── snaigame.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── PreloadDemo.xcscheme │ └── xcuserdata │ │ ├── shenjie.xcuserdatad │ │ ├── xcdebugger │ │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ │ └── xcschememanagement.plist │ │ └── snaigame.xcuserdatad │ │ └── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist ├── PreloadDemo.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ ├── shenjie.xcuserdatad │ │ ├── UserInterfaceState.xcuserstate │ │ └── xcdebugger │ │ │ └── Breakpoints_v2.xcbkptlist │ │ └── snaigame.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── PreloadDemo │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AccentColor.colorset │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json │ ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard │ ├── Info.plist │ ├── Model │ └── ImageModel.swift │ ├── NetWork │ └── RobohashClient.swift │ ├── SceneDelegate.swift │ ├── View │ └── ProloadTableViewCell.swift │ ├── ViewController.swift │ └── ViewModel │ └── PreloadCellViewModel.swift ├── README.md └── 参考 ├── .DS_Store ├── MDTable-master ├── .gitignore ├── Documents │ └── Chinese Document.md ├── LICENSE ├── Logo │ └── Logo.png ├── MDTable.podspec ├── MDTable │ ├── MDTable.xcodeproj │ │ ├── project.pbxproj │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── MDTable.xcscheme │ └── MDTable │ │ ├── Info.plist │ │ └── MDTable.h ├── MDTableExample.xcodeproj │ └── project.pbxproj ├── MDTableExample │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Logo.png │ │ │ └── Logo_120-1.png │ │ ├── Contents.json │ │ ├── LaunchScreen.imageset │ │ │ ├── Contents.json │ │ │ └── LaunchScreen.png │ │ ├── avatar.imageset │ │ │ ├── Contents.json │ │ │ └── avatar@2x.png │ │ ├── channel_1.imageset │ │ │ ├── Contents.json │ │ │ └── channel_1.jpeg │ │ ├── channel_2.imageset │ │ │ ├── Contents.json │ │ │ └── channel_2.jpeg │ │ ├── channel_3.imageset │ │ │ ├── Contents.json │ │ │ └── channel_3.jpeg │ │ ├── channel_4.imageset │ │ │ ├── Contents.json │ │ │ └── channel_4.jpeg │ │ ├── channel_5.imageset │ │ │ ├── Contents.json │ │ │ └── channel_5.jpeg │ │ ├── channel_6.imageset │ │ │ ├── Contents.json │ │ │ └── channel_6.jpeg │ │ ├── cm2_daily_banner1.imageset │ │ │ ├── Contents.json │ │ │ └── cm2_daily_banner1@2x.jpg │ │ ├── cm2_daily_banner2.imageset │ │ │ ├── Contents.json │ │ │ └── cm2_daily_banner2@2x.jpg │ │ ├── cm2_daily_banner3.imageset │ │ │ ├── Contents.json │ │ │ └── cm2_daily_banner3@2x.jpg │ │ ├── cm2_daily_banner4.imageset │ │ │ ├── Contents.json │ │ │ └── cm2_daily_banner4@2x.jpg │ │ ├── cm2_daily_banner5.imageset │ │ │ ├── Contents.json │ │ │ └── cm2_daily_banner5@2x.jpg │ │ ├── cm2_daily_banner6.imageset │ │ │ ├── Contents.json │ │ │ └── cm2_daily_banner6@2x.jpg │ │ ├── cm2_icn_light.imageset │ │ │ ├── Contents.json │ │ │ ├── cm2_icn_light.png │ │ │ ├── cm2_icn_light@2x.png │ │ │ └── cm2_icn_light@3x.png │ │ ├── cm2_list_morecmt_icn_arr.imageset │ │ │ ├── Contents.json │ │ │ ├── cm2_list_morecmt_icn_arr.png │ │ │ ├── cm2_list_morecmt_icn_arr@2x.png │ │ │ └── cm2_list_morecmt_icn_arr@3x.png │ │ ├── cm4_cover_btm_mask.imageset │ │ │ ├── Contents.json │ │ │ ├── cm4_cover_btm_mask.png │ │ │ ├── cm4_cover_btm_mask@2x.png │ │ │ └── cm4_cover_btm_mask@3x.png │ │ ├── cm4_cover_digital_disc.imageset │ │ │ ├── Contents.json │ │ │ ├── cm4_cover_digital_disc.png │ │ │ ├── cm4_cover_digital_disc@2x.png │ │ │ └── cm4_cover_digital_disc@3x.png │ │ ├── cm4_cover_icn_music.imageset │ │ │ ├── Contents.json │ │ │ ├── cm4_cover_icn_music.png │ │ │ ├── cm4_cover_icn_music@2x.png │ │ │ └── cm4_cover_icn_music@3x.png │ │ ├── cm4_cover_icn_video.imageset │ │ │ ├── Contents.json │ │ │ ├── cm4_cover_icn_video.png │ │ │ ├── cm4_cover_icn_video@2x.png │ │ │ └── cm4_cover_icn_video@3x.png │ │ ├── cm4_cover_top_mask-1.imageset │ │ │ ├── Contents.json │ │ │ ├── cm4_cover_icn_video.png │ │ │ ├── cm4_cover_icn_video@2x.png │ │ │ └── cm4_cover_icn_video@3x.png │ │ ├── cm4_cover_top_mask.imageset │ │ │ ├── Contents.json │ │ │ ├── cm4_cover_top_mask.png │ │ │ ├── cm4_cover_top_mask@2x.png │ │ │ └── cm4_cover_top_mask@3x.png │ │ ├── cm4_disc_cover_new.imageset │ │ │ ├── Contents.json │ │ │ ├── cm4_disc_cover_new.png │ │ │ ├── cm4_disc_cover_new@2x.png │ │ │ └── cm4_disc_cover_new@3x.png │ │ ├── cm4_disc_topbtn.imageset │ │ │ ├── Contents.json │ │ │ ├── cm4_disc_topbtn@2x.png │ │ │ └── cm4_disc_topbtn@3x.png │ │ ├── cm4_disc_topbtn_daily.imageset │ │ │ ├── Contents.json │ │ │ ├── cm4_disc_topbtn_daily.png │ │ │ ├── cm4_disc_topbtn_daily@2x.png │ │ │ └── cm4_disc_topbtn_daily@3x.png │ │ ├── cm4_disc_topbtn_daily_prs.imageset │ │ │ ├── Contents.json │ │ │ ├── cm4_disc_topbtn_daily_prs.png │ │ │ ├── cm4_disc_topbtn_daily_prs@2x.png │ │ │ └── cm4_disc_topbtn_daily_prs@3x.png │ │ ├── cm4_disc_topbtn_fm.imageset │ │ │ ├── Contents.json │ │ │ ├── cm4_disc_topbtn_fm@2x.png │ │ │ └── cm4_disc_topbtn_fm@3x.png │ │ ├── cm4_disc_topbtn_fm_prs.imageset │ │ │ ├── Contents.json │ │ │ ├── cm4_disc_topbtn_fm_prs.png │ │ │ ├── cm4_disc_topbtn_fm_prs@2x.png │ │ │ └── cm4_disc_topbtn_fm_prs@3x.png │ │ ├── cm4_disc_topbtn_rank.imageset │ │ │ ├── Contents.json │ │ │ ├── cm4_disc_topbtn_rank@2x.png │ │ │ └── cm4_disc_topbtn_rank@3x.png │ │ ├── cm4_disc_topbtn_rank_prs.imageset │ │ │ ├── Contents.json │ │ │ ├── cm4_disc_topbtn_rank_prs.png │ │ │ ├── cm4_disc_topbtn_rank_prs@2x.png │ │ │ └── cm4_disc_topbtn_rank_prs@3x.png │ │ ├── cm4_disc_type_video.imageset │ │ │ ├── Contents.json │ │ │ ├── cm4_disc_type_video.png │ │ │ ├── cm4_disc_type_video@2x.png │ │ │ └── cm4_disc_type_video@3x.png │ │ ├── columnistl_1.imageset │ │ │ ├── Contents.json │ │ │ └── columnistl_1.jpeg │ │ ├── columnistl_2.imageset │ │ │ ├── Contents.json │ │ │ └── columnistl_2.jpeg │ │ ├── columnistl_3.imageset │ │ │ ├── Columnistl_3.jpeg │ │ │ └── Contents.json │ │ ├── exclusive_1.imageset │ │ │ ├── Contents.json │ │ │ └── exclusive_1.jpeg │ │ ├── exclusive_2.imageset │ │ │ ├── Contents.json │ │ │ └── exclusive_2.jpeg │ │ ├── exclusive_3.imageset │ │ │ ├── Contents.json │ │ │ └── exclusive_3.jpeg │ │ ├── music_1.imageset │ │ │ ├── Contents.json │ │ │ └── music_1.png │ │ ├── music_2.imageset │ │ │ ├── Contents.json │ │ │ └── music_2.jpeg │ │ ├── music_3.imageset │ │ │ ├── Contents.json │ │ │ └── music_3.jpeg │ │ ├── music_4.imageset │ │ │ ├── Contents.json │ │ │ └── music_4.jpeg │ │ ├── music_5.imageset │ │ │ ├── Contents.json │ │ │ └── music_5.jpeg │ │ ├── music_6.imageset │ │ │ ├── Contents.json │ │ │ └── music_6.jpeg │ │ ├── music_sheet_1.imageset │ │ │ ├── Contents.json │ │ │ └── music_sheet_1.jpeg │ │ ├── music_sheet_2.imageset │ │ │ ├── Contents.json │ │ │ └── music_sheet_2.jpeg │ │ ├── music_sheet_3.imageset │ │ │ ├── Contents.json │ │ │ └── music_sheet_3.jpeg │ │ ├── music_sheet_4.imageset │ │ │ ├── Contents.json │ │ │ └── music_sheet_4.jpeg │ │ ├── music_sheet_5.imageset │ │ │ ├── Contents.json │ │ │ └── music_sheet_5.jpeg │ │ ├── music_sheet_6.imageset │ │ │ ├── Contents.json │ │ │ └── music_sheet_6.jpeg │ │ ├── mv_1.imageset │ │ │ ├── Contents.json │ │ │ └── mv_1.jpeg │ │ ├── mv_2.imageset │ │ │ ├── Contents.json │ │ │ └── mv_2.jpeg │ │ ├── mv_3.imageset │ │ │ ├── Contents.json │ │ │ └── mv_3.jpeg │ │ └── mv_4.imageset │ │ │ ├── Contents.json │ │ │ └── mv_4.jpeg │ ├── AvatarItemView.swift │ ├── Banner.swift │ ├── BaseNavigationController.swift │ ├── Channel.swift │ ├── ChannelItemView.swift │ ├── ColumnTitle.swift │ ├── Columnist.swift │ ├── ColumnistItemCell.swift │ ├── CusomCellWithXib.swift │ ├── CusomCellWithXib.xib │ ├── CustomCellWithXibController.swift │ ├── DynamicHeightCell.swift │ ├── DynamicHeightCellController.swift │ ├── DynamicHeightRow.swift │ ├── EditableTableViewController.swift │ ├── Exclusive.swift │ ├── ExclusiveItemView.swift │ ├── Extension.swift │ ├── FPS.swift │ ├── Footer.swift │ ├── Info.plist │ ├── LaunchScreen.storyboard │ ├── MV.swift │ ├── MVItemView.swift │ ├── Main.storyboard │ ├── MainTableViewController.swift │ ├── Menu.swift │ ├── MenuItemView.swift │ ├── MenuTableViewController.swift │ ├── Music.swift │ ├── MusicItemView.swift │ ├── NMColumnTitleCell.xib │ ├── NeteaseCloudMusicController.swift │ ├── NeteaseCloudMusicSortController.swift │ ├── ParallexBanner.swift │ ├── PlaceHolder.jpeg │ ├── Recommend.swift │ ├── RecommendItemView.swift │ ├── ReorderTableViewController.swift │ ├── SectionIndexTitleController.swift │ ├── SortableSection.swift │ ├── SystemCellController.swift │ └── XibRow.swift ├── README.md ├── Screenshot │ └── MainList.png └── Source │ ├── Cell.swift │ ├── Delegate.swift │ ├── Dispatch.swift │ ├── Edit.swift │ ├── Focus.swift │ ├── Manager.swift │ ├── Menu.swift │ ├── Preload.swift │ ├── ReactiveRow.swift │ ├── Row.swift │ ├── RowConvertable.swift │ ├── Section.swift │ ├── SectionConvertable.swift │ ├── Table.swift │ └── Util.swift ├── ModeratorsExplorer-master ├── .DS_Store ├── ModeratorsExplorer.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ ├── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ │ └── xcuserdata │ │ │ ├── critz.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ │ │ ├── ernesto.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ │ │ ├── lboaro.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ │ │ ├── macmini.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ │ │ ├── pierre.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ │ │ ├── shenjie.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ │ │ └── xwu.xcuserdatad │ │ │ └── UserInterfaceState.xcuserstate │ ├── xcshareddata │ │ ├── IDETemplateMacros.plist │ │ └── xcschemes │ │ │ └── ModeratorsExplorer.xcscheme │ └── xcuserdata │ │ ├── shenjie.xcuserdatad │ │ ├── xcdebugger │ │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ │ └── xcschememanagement.plist │ │ └── xwu.xcuserdatad │ │ ├── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist │ │ └── xcschemes │ │ └── xcschememanagement.plist ├── ModeratorsExplorer │ ├── .DS_Store │ ├── AlertDisplayer.swift │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ ├── .DS_Store │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Icon1024.png │ │ │ ├── Icon20.png │ │ │ ├── Icon20@2x.png │ │ │ ├── Icon29.png │ │ │ ├── Icon29@2x.png │ │ │ ├── Icon40.png │ │ │ ├── Icon40@2x.png │ │ │ ├── Icon76.png │ │ │ ├── Icon76@2x.png │ │ │ ├── Icon83.5@2x.png │ │ │ ├── icon-app-20@2x.png │ │ │ ├── icon-app-20@3x.png │ │ │ ├── icon-app-29@2x.png │ │ │ ├── icon-app-29@3x copy.png │ │ │ ├── icon-app-40@2x.png │ │ │ ├── icon-app-40@3x.png │ │ │ ├── icon-app-60@2x.png │ │ │ └── icon-app-60@3x.png │ │ ├── Contents.json │ │ ├── rw-logo.imageset │ │ │ ├── Contents.json │ │ │ └── Razewarelogo_1024.png │ │ ├── rwdevcon-bg.imageset │ │ │ ├── Contents.json │ │ │ └── rwdevcon-bg.png │ │ └── se-icon.imageset │ │ │ ├── Contents.json │ │ │ └── se-icon.png │ ├── Base.lproj │ │ └── Main.storyboard │ ├── ButtonEnablingBehavior.swift │ ├── ColorPalette.swift │ ├── Controllers │ │ ├── .DS_Store │ │ ├── ModeratorsListViewController.swift │ │ └── ModeratorsSearchViewController.swift │ ├── Double+Extensions.swift │ ├── HTTPURLResponse.swift │ ├── Info.plist │ ├── LaunchScreen.storyboard │ ├── Models │ │ ├── .DS_Store │ │ └── Moderator.swift │ ├── Services │ │ ├── .DS_Store │ │ ├── Networking │ │ │ ├── .DS_Store │ │ │ ├── DataResponseError.swift │ │ │ ├── ModeratorRequest.swift │ │ │ ├── PagedModeratorResponse.swift │ │ │ └── URLRequest.swift │ │ ├── Result.swift │ │ └── StackExchangeClient.swift │ ├── String+Extensions.swift │ ├── UITextField+Extensions.swift │ ├── ViewModels │ │ ├── .DS_Store │ │ └── ModeratorsViewModel.swift │ └── Views │ │ ├── .DS_Store │ │ └── ModeratorTableViewCell.swift └── README.md ├── NukeDemo-main ├── .gitignore ├── NukeDemo.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── swiftpm │ │ │ └── Package.resolved │ └── xcshareddata │ │ └── xcschemes │ │ └── NukeDemo.xcscheme ├── README.md ├── Resources │ ├── IB │ │ └── Base.lproj │ │ │ ├── LaunchScreen.xib │ │ │ └── Main.storyboard │ ├── Images.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── 100.png │ │ │ ├── 1024.png │ │ │ ├── 114.png │ │ │ ├── 120.png │ │ │ ├── 144.png │ │ │ ├── 152.png │ │ │ ├── 167.png │ │ │ ├── 180.png │ │ │ ├── 20.png │ │ │ ├── 29.png │ │ │ ├── 40.png │ │ │ ├── 50.png │ │ │ ├── 57.png │ │ │ ├── 58.png │ │ │ ├── 60.png │ │ │ ├── 72.png │ │ │ ├── 76.png │ │ │ ├── 80.png │ │ │ ├── 87.png │ │ │ └── Contents.json │ │ └── Contents.json │ ├── Info.plist │ ├── baseline.jpeg │ └── progressive.jpeg └── Sources │ ├── AlamofireIntegrationDemoViewController.swift │ ├── AnimatedImageUsingVideoViewController.swift │ ├── AnimatedImageViewController.swift │ ├── AppDelegate.swift │ ├── BasicDemoViewController.swift │ ├── DataCachingDemoViewController.swift │ ├── Helpers │ ├── Images.swift │ └── Utilities.swift │ ├── ImagePipelineSettingsViewController.storyboard │ ├── ImagePipelineSettingsViewController.swift │ ├── ImageProcessingDemoViewController.swift │ ├── MenuViewController.swift │ ├── PrefetchSwiftUIDemo.swift │ ├── PrefetchingDemoViewController.swift │ ├── ProgressiveDecodingDemoViewController.swift │ ├── RateLimiterDemoViewController.swift │ └── SwiftSVGDemoViewController.swift ├── TableViewPrefetch-master ├── .gitignore ├── README.md ├── TableViewPrefetch.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── TableViewPrefetch │ ├── Controllers │ └── ImageViewController.swift │ ├── Models │ ├── ImageDataStore.swift │ └── ImageModel.swift │ ├── Other Gubbins │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ └── Contents.json │ ├── Base.lproj │ │ └── LaunchScreen.storyboard │ └── Info.plist │ └── Views │ ├── Base.lproj │ └── Main.storyboard │ └── ImageTableViewCell.swift └── prefetch-master ├── Prefetch.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ ├── xcshareddata │ │ └── IDEWorkspaceChecks.plist │ └── xcuserdata │ │ ├── shenjie.xcuserdatad │ │ └── UserInterfaceState.xcuserstate │ │ └── soul.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcuserdata │ ├── shenjie.xcuserdatad │ └── xcschemes │ │ └── xcschememanagement.plist │ └── soul.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── Prefetch ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ └── row.imageset │ │ ├── Contents.json │ │ ├── font-awesome_4-7-0_align-justify_16_0_007dff_none.png │ │ ├── font-awesome_4-7-0_align-justify_32_0_007dff_none.png │ │ └── font-awesome_4-7-0_align-justify_48_0_007dff_none.png ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Controller │ ├── BatchViewController.swift │ ├── PrefetchViewController.swift │ └── ViewController.swift ├── Info.plist ├── Model │ ├── Coin.swift │ ├── News.swift │ └── Post.swift └── View │ ├── CoinTableViewCell.swift │ ├── CoinTableViewCell.xib │ ├── LoadingTableViewCell.swift │ ├── LoadingTableViewCell.xib │ ├── NewsTableViewCell.swift │ ├── NewsTableViewCell.xib │ ├── PostTableViewCell.swift │ └── PostTableViewCell.xib ├── README.md └── screenshot.png /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/.DS_Store -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Shenjie 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /PreloadDemo/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/PreloadDemo/.DS_Store -------------------------------------------------------------------------------- /PreloadDemo/Podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '10.0' 2 | use_frameworks! 3 | 4 | target 'PreloadDemo' do 5 | pod 'Alamofire', '~> 5.2' 6 | pod 'Kingfisher', '~> 6.0' 7 | end -------------------------------------------------------------------------------- /PreloadDemo/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODFILE CHECKSUM: 0c74f426bb4d16a56452c71bc4350bfb58c2fc04 2 | 3 | COCOAPODS: 1.9.1 4 | -------------------------------------------------------------------------------- /PreloadDemo/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODFILE CHECKSUM: 0c74f426bb4d16a56452c71bc4350bfb58c2fc04 2 | 3 | COCOAPODS: 1.9.1 4 | -------------------------------------------------------------------------------- /PreloadDemo/Pods/Pods.xcodeproj/xcuserdata/shenjie.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Alamofire.xcscheme 8 | 9 | isShown 10 | 11 | 12 | Kingfisher.xcscheme 13 | 14 | isShown 15 | 16 | 17 | Pods-PreloadDemo.xcscheme 18 | 19 | isShown 20 | 21 | 22 | 23 | SuppressBuildableAutocreation 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /PreloadDemo/Pods/Pods.xcodeproj/xcuserdata/snaigame.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Pods-PreloadDemo.xcscheme 8 | 9 | isShown 10 | 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /PreloadDemo/Pods/Target Support Files/Pods-PreloadDemo/Pods-PreloadDemo-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /PreloadDemo/Pods/Target Support Files/Pods-PreloadDemo/Pods-PreloadDemo-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /PreloadDemo/Pods/Target Support Files/Pods-PreloadDemo/Pods-PreloadDemo-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /PreloadDemo/Pods/Target Support Files/Pods-PreloadDemo/Pods-PreloadDemo-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_PreloadDemo : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_PreloadDemo 5 | @end 6 | -------------------------------------------------------------------------------- /PreloadDemo/Pods/Target Support Files/Pods-PreloadDemo/Pods-PreloadDemo-frameworks-Debug-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-PreloadDemo/Pods-PreloadDemo-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework 3 | ${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework -------------------------------------------------------------------------------- /PreloadDemo/Pods/Target Support Files/Pods-PreloadDemo/Pods-PreloadDemo-frameworks-Debug-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework 2 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Kingfisher.framework -------------------------------------------------------------------------------- /PreloadDemo/Pods/Target Support Files/Pods-PreloadDemo/Pods-PreloadDemo-frameworks-Release-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-PreloadDemo/Pods-PreloadDemo-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework 3 | ${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework -------------------------------------------------------------------------------- /PreloadDemo/Pods/Target Support Files/Pods-PreloadDemo/Pods-PreloadDemo-frameworks-Release-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework 2 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Kingfisher.framework -------------------------------------------------------------------------------- /PreloadDemo/Pods/Target Support Files/Pods-PreloadDemo/Pods-PreloadDemo-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_PreloadDemoVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_PreloadDemoVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /PreloadDemo/Pods/Target Support Files/Pods-PreloadDemo/Pods-PreloadDemo.debug.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | PODS_BUILD_DIR = ${BUILD_DIR} 3 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 4 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 5 | PODS_ROOT = ${SRCROOT}/Pods 6 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 7 | -------------------------------------------------------------------------------- /PreloadDemo/Pods/Target Support Files/Pods-PreloadDemo/Pods-PreloadDemo.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_PreloadDemo { 2 | umbrella header "Pods-PreloadDemo-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /PreloadDemo/Pods/Target Support Files/Pods-PreloadDemo/Pods-PreloadDemo.release.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | PODS_BUILD_DIR = ${BUILD_DIR} 3 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 4 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 5 | PODS_ROOT = ${SRCROOT}/Pods 6 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 7 | -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo.xcodeproj/project.xcworkspace/xcuserdata/shenjie.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/PreloadDemo/PreloadDemo.xcodeproj/project.xcworkspace/xcuserdata/shenjie.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo.xcodeproj/project.xcworkspace/xcuserdata/snaigame.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/PreloadDemo/PreloadDemo.xcodeproj/project.xcworkspace/xcuserdata/snaigame.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo.xcodeproj/xcuserdata/shenjie.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo.xcodeproj/xcuserdata/shenjie.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | PreloadDemo.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | E5D9E1242609BC010054280A 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo.xcodeproj/xcuserdata/snaigame.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 9 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo.xcworkspace/xcuserdata/shenjie.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/PreloadDemo/PreloadDemo.xcworkspace/xcuserdata/shenjie.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo.xcworkspace/xcuserdata/shenjie.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo.xcworkspace/xcuserdata/snaigame.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/PreloadDemo/PreloadDemo.xcworkspace/xcuserdata/snaigame.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // PreloadDemo 4 | // 5 | // Created by shenjie on 2021/3/23. 6 | // 7 | 8 | import UIKit 9 | 10 | @main 11 | class AppDelegate: UIResponder, UIApplicationDelegate { 12 | 13 | 14 | 15 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 16 | // Override point for customization after application launch. 17 | return true 18 | } 19 | 20 | // MARK: UISceneSession Lifecycle 21 | 22 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 23 | // Called when a new scene session is being created. 24 | // Use this method to select a configuration to create the new scene with. 25 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 26 | } 27 | 28 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { 29 | // Called when the user discards a scene session. 30 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 31 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 32 | } 33 | 34 | 35 | } 36 | 37 | -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "scale" : "1x", 46 | "size" : "20x20" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "scale" : "2x", 51 | "size" : "20x20" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "scale" : "1x", 56 | "size" : "29x29" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "29x29" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "scale" : "1x", 66 | "size" : "40x40" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "scale" : "2x", 71 | "size" : "40x40" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "scale" : "1x", 76 | "size" : "76x76" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "scale" : "2x", 81 | "size" : "76x76" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "scale" : "2x", 86 | "size" : "83.5x83.5" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "scale" : "1x", 91 | "size" : "1024x1024" 92 | } 93 | ], 94 | "info" : { 95 | "author" : "xcode", 96 | "version" : 1 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /PreloadDemo/PreloadDemo/Model/ImageModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageModel.swift 3 | // PreloadDemo 4 | // 5 | // Created by shenjie on 2021/4/2. 6 | // 7 | 8 | import Foundation 9 | 10 | struct ImageModel { 11 | var url: URL? 12 | var order: Int? 13 | 14 | init(url: String, order: Int) { 15 | self.url = URL(string: url) 16 | self.order = order 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ProloadDemo 2 | 3 | 该 Demo 记录了一些优雅处理网络数据的方式: 4 | 1. 实现列表无限滚动时,数据如何预加载,从而达到无缝加载的效果; 5 | 2. 滚动时 UI 卡顿的解决方案该如何实现; 6 | 3. 如何优化网络,利用数据缓存来节约流量和系统的内存; 7 | -------------------------------------------------------------------------------- /参考/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/.DS_Store -------------------------------------------------------------------------------- /参考/MDTable-master/.gitignore: -------------------------------------------------------------------------------- 1 | # For Xcode 2 | .DS_Store 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | *.xcworkspace 13 | !default.xcworkspace 14 | xcuserdata 15 | profile 16 | *.moved-aside 17 | DerivedData 18 | .idea/ 19 | -------------------------------------------------------------------------------- /参考/MDTable-master/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 Leo 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /参考/MDTable-master/Logo/Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/Logo/Logo.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTable.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'MDTable' 3 | s.version = '0.3.0' 4 | s.summary = 'Elegant way to write tableView in Swift' 5 | s.description = <<-DESC 6 | A simple but power wrapper of UITableView to create model-driven TableView. 7 | DESC 8 | 9 | s.homepage = 'https://github.com/LeoMobileDeveloper/MDTable' 10 | s.license = { :type => 'MIT', :file => 'LICENSE' } 11 | s.author = { 'Leo' => 'leomobiledeveloper@gmail.com' } 12 | s.source = { :git => 'https://github.com/LeoMobileDeveloper/MDTable.git', :tag => s.version.to_s } 13 | s.ios.deployment_target = '8.0' 14 | s.source_files = 'Source/**/*' 15 | end 16 | 17 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTable/MDTable/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTable/MDTable/MDTable.h: -------------------------------------------------------------------------------- 1 | // 2 | // MDTable.h 3 | // MDTable 4 | // 5 | // Created by Leo on 2017/6/15. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for MDTable. 12 | FOUNDATION_EXPORT double MDTableVersionNumber; 13 | 14 | //! Project version string for MDTable. 15 | FOUNDATION_EXPORT const unsigned char MDTableVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "60x60", 35 | "idiom" : "iphone", 36 | "filename" : "Logo_120-1.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "60x60", 41 | "idiom" : "iphone", 42 | "filename" : "Logo.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "idiom" : "ipad", 47 | "size" : "20x20", 48 | "scale" : "1x" 49 | }, 50 | { 51 | "idiom" : "ipad", 52 | "size" : "20x20", 53 | "scale" : "2x" 54 | }, 55 | { 56 | "idiom" : "ipad", 57 | "size" : "29x29", 58 | "scale" : "1x" 59 | }, 60 | { 61 | "idiom" : "ipad", 62 | "size" : "29x29", 63 | "scale" : "2x" 64 | }, 65 | { 66 | "idiom" : "ipad", 67 | "size" : "40x40", 68 | "scale" : "1x" 69 | }, 70 | { 71 | "idiom" : "ipad", 72 | "size" : "40x40", 73 | "scale" : "2x" 74 | }, 75 | { 76 | "idiom" : "ipad", 77 | "size" : "76x76", 78 | "scale" : "1x" 79 | }, 80 | { 81 | "idiom" : "ipad", 82 | "size" : "76x76", 83 | "scale" : "2x" 84 | }, 85 | { 86 | "idiom" : "ipad", 87 | "size" : "83.5x83.5", 88 | "scale" : "2x" 89 | } 90 | ], 91 | "info" : { 92 | "version" : 1, 93 | "author" : "xcode" 94 | } 95 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/AppIcon.appiconset/Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/AppIcon.appiconset/Logo.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/AppIcon.appiconset/Logo_120-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/AppIcon.appiconset/Logo_120-1.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/LaunchScreen.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchScreen.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/LaunchScreen.imageset/LaunchScreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/LaunchScreen.imageset/LaunchScreen.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/avatar.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "avatar@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/avatar.imageset/avatar@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/avatar.imageset/avatar@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/channel_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "channel_1.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/channel_1.imageset/channel_1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/channel_1.imageset/channel_1.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/channel_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "channel_2.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/channel_2.imageset/channel_2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/channel_2.imageset/channel_2.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/channel_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "channel_3.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/channel_3.imageset/channel_3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/channel_3.imageset/channel_3.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/channel_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "channel_4.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/channel_4.imageset/channel_4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/channel_4.imageset/channel_4.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/channel_5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "channel_5.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/channel_5.imageset/channel_5.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/channel_5.imageset/channel_5.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/channel_6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "channel_6.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/channel_6.imageset/channel_6.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/channel_6.imageset/channel_6.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "cm2_daily_banner1@2x.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner1.imageset/cm2_daily_banner1@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner1.imageset/cm2_daily_banner1@2x.jpg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "cm2_daily_banner2@2x.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner2.imageset/cm2_daily_banner2@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner2.imageset/cm2_daily_banner2@2x.jpg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "cm2_daily_banner3@2x.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner3.imageset/cm2_daily_banner3@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner3.imageset/cm2_daily_banner3@2x.jpg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "cm2_daily_banner4@2x.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner4.imageset/cm2_daily_banner4@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner4.imageset/cm2_daily_banner4@2x.jpg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "cm2_daily_banner5@2x.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner5.imageset/cm2_daily_banner5@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner5.imageset/cm2_daily_banner5@2x.jpg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "cm2_daily_banner6@2x.jpg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner6.imageset/cm2_daily_banner6@2x.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_daily_banner6.imageset/cm2_daily_banner6@2x.jpg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_icn_light.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cm2_icn_light.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cm2_icn_light@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "cm2_icn_light@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_icn_light.imageset/cm2_icn_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_icn_light.imageset/cm2_icn_light.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_icn_light.imageset/cm2_icn_light@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_icn_light.imageset/cm2_icn_light@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_icn_light.imageset/cm2_icn_light@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_icn_light.imageset/cm2_icn_light@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_list_morecmt_icn_arr.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cm2_list_morecmt_icn_arr.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cm2_list_morecmt_icn_arr@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "cm2_list_morecmt_icn_arr@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_list_morecmt_icn_arr.imageset/cm2_list_morecmt_icn_arr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_list_morecmt_icn_arr.imageset/cm2_list_morecmt_icn_arr.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_list_morecmt_icn_arr.imageset/cm2_list_morecmt_icn_arr@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_list_morecmt_icn_arr.imageset/cm2_list_morecmt_icn_arr@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_list_morecmt_icn_arr.imageset/cm2_list_morecmt_icn_arr@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm2_list_morecmt_icn_arr.imageset/cm2_list_morecmt_icn_arr@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_btm_mask.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cm4_cover_btm_mask.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cm4_cover_btm_mask@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "cm4_cover_btm_mask@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_btm_mask.imageset/cm4_cover_btm_mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_btm_mask.imageset/cm4_cover_btm_mask.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_btm_mask.imageset/cm4_cover_btm_mask@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_btm_mask.imageset/cm4_cover_btm_mask@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_btm_mask.imageset/cm4_cover_btm_mask@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_btm_mask.imageset/cm4_cover_btm_mask@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_digital_disc.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cm4_cover_digital_disc.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cm4_cover_digital_disc@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "cm4_cover_digital_disc@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_digital_disc.imageset/cm4_cover_digital_disc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_digital_disc.imageset/cm4_cover_digital_disc.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_digital_disc.imageset/cm4_cover_digital_disc@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_digital_disc.imageset/cm4_cover_digital_disc@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_digital_disc.imageset/cm4_cover_digital_disc@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_digital_disc.imageset/cm4_cover_digital_disc@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_icn_music.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cm4_cover_icn_music.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cm4_cover_icn_music@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "cm4_cover_icn_music@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_icn_music.imageset/cm4_cover_icn_music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_icn_music.imageset/cm4_cover_icn_music.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_icn_music.imageset/cm4_cover_icn_music@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_icn_music.imageset/cm4_cover_icn_music@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_icn_music.imageset/cm4_cover_icn_music@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_icn_music.imageset/cm4_cover_icn_music@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_icn_video.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cm4_cover_icn_video.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cm4_cover_icn_video@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "cm4_cover_icn_video@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_icn_video.imageset/cm4_cover_icn_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_icn_video.imageset/cm4_cover_icn_video.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_icn_video.imageset/cm4_cover_icn_video@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_icn_video.imageset/cm4_cover_icn_video@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_icn_video.imageset/cm4_cover_icn_video@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_icn_video.imageset/cm4_cover_icn_video@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_top_mask-1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cm4_cover_icn_video.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cm4_cover_icn_video@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "cm4_cover_icn_video@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_top_mask-1.imageset/cm4_cover_icn_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_top_mask-1.imageset/cm4_cover_icn_video.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_top_mask-1.imageset/cm4_cover_icn_video@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_top_mask-1.imageset/cm4_cover_icn_video@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_top_mask-1.imageset/cm4_cover_icn_video@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_top_mask-1.imageset/cm4_cover_icn_video@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_top_mask.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cm4_cover_top_mask.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cm4_cover_top_mask@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "cm4_cover_top_mask@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_top_mask.imageset/cm4_cover_top_mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_top_mask.imageset/cm4_cover_top_mask.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_top_mask.imageset/cm4_cover_top_mask@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_top_mask.imageset/cm4_cover_top_mask@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_top_mask.imageset/cm4_cover_top_mask@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_cover_top_mask.imageset/cm4_cover_top_mask@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_cover_new.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cm4_disc_cover_new.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cm4_disc_cover_new@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "cm4_disc_cover_new@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_cover_new.imageset/cm4_disc_cover_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_cover_new.imageset/cm4_disc_cover_new.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_cover_new.imageset/cm4_disc_cover_new@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_cover_new.imageset/cm4_disc_cover_new@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_cover_new.imageset/cm4_disc_cover_new@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_cover_new.imageset/cm4_disc_cover_new@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "cm4_disc_topbtn@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "cm4_disc_topbtn@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn.imageset/cm4_disc_topbtn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn.imageset/cm4_disc_topbtn@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn.imageset/cm4_disc_topbtn@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn.imageset/cm4_disc_topbtn@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_daily.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cm4_disc_topbtn_daily.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cm4_disc_topbtn_daily@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "cm4_disc_topbtn_daily@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_daily.imageset/cm4_disc_topbtn_daily.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_daily.imageset/cm4_disc_topbtn_daily.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_daily.imageset/cm4_disc_topbtn_daily@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_daily.imageset/cm4_disc_topbtn_daily@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_daily.imageset/cm4_disc_topbtn_daily@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_daily.imageset/cm4_disc_topbtn_daily@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_daily_prs.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cm4_disc_topbtn_daily_prs.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cm4_disc_topbtn_daily_prs@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "cm4_disc_topbtn_daily_prs@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_daily_prs.imageset/cm4_disc_topbtn_daily_prs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_daily_prs.imageset/cm4_disc_topbtn_daily_prs.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_daily_prs.imageset/cm4_disc_topbtn_daily_prs@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_daily_prs.imageset/cm4_disc_topbtn_daily_prs@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_daily_prs.imageset/cm4_disc_topbtn_daily_prs@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_daily_prs.imageset/cm4_disc_topbtn_daily_prs@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_fm.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "cm4_disc_topbtn_fm@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "cm4_disc_topbtn_fm@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_fm.imageset/cm4_disc_topbtn_fm@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_fm.imageset/cm4_disc_topbtn_fm@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_fm.imageset/cm4_disc_topbtn_fm@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_fm.imageset/cm4_disc_topbtn_fm@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_fm_prs.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cm4_disc_topbtn_fm_prs.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cm4_disc_topbtn_fm_prs@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "cm4_disc_topbtn_fm_prs@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_fm_prs.imageset/cm4_disc_topbtn_fm_prs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_fm_prs.imageset/cm4_disc_topbtn_fm_prs.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_fm_prs.imageset/cm4_disc_topbtn_fm_prs@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_fm_prs.imageset/cm4_disc_topbtn_fm_prs@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_fm_prs.imageset/cm4_disc_topbtn_fm_prs@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_fm_prs.imageset/cm4_disc_topbtn_fm_prs@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_rank.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "cm4_disc_topbtn_rank@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "cm4_disc_topbtn_rank@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_rank.imageset/cm4_disc_topbtn_rank@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_rank.imageset/cm4_disc_topbtn_rank@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_rank.imageset/cm4_disc_topbtn_rank@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_rank.imageset/cm4_disc_topbtn_rank@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_rank_prs.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cm4_disc_topbtn_rank_prs.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cm4_disc_topbtn_rank_prs@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "cm4_disc_topbtn_rank_prs@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_rank_prs.imageset/cm4_disc_topbtn_rank_prs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_rank_prs.imageset/cm4_disc_topbtn_rank_prs.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_rank_prs.imageset/cm4_disc_topbtn_rank_prs@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_rank_prs.imageset/cm4_disc_topbtn_rank_prs@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_rank_prs.imageset/cm4_disc_topbtn_rank_prs@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_topbtn_rank_prs.imageset/cm4_disc_topbtn_rank_prs@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_type_video.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cm4_disc_type_video.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cm4_disc_type_video@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "cm4_disc_type_video@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_type_video.imageset/cm4_disc_type_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_type_video.imageset/cm4_disc_type_video.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_type_video.imageset/cm4_disc_type_video@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_type_video.imageset/cm4_disc_type_video@2x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_type_video.imageset/cm4_disc_type_video@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/cm4_disc_type_video.imageset/cm4_disc_type_video@3x.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/columnistl_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "columnistl_1.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/columnistl_1.imageset/columnistl_1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/columnistl_1.imageset/columnistl_1.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/columnistl_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "columnistl_2.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/columnistl_2.imageset/columnistl_2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/columnistl_2.imageset/columnistl_2.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/columnistl_3.imageset/Columnistl_3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/columnistl_3.imageset/Columnistl_3.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/columnistl_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Columnistl_3.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/exclusive_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "exclusive_1.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/exclusive_1.imageset/exclusive_1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/exclusive_1.imageset/exclusive_1.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/exclusive_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "exclusive_2.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/exclusive_2.imageset/exclusive_2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/exclusive_2.imageset/exclusive_2.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/exclusive_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "exclusive_3.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/exclusive_3.imageset/exclusive_3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/exclusive_3.imageset/exclusive_3.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "music_1.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_1.imageset/music_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/music_1.imageset/music_1.png -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "music_2.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_2.imageset/music_2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/music_2.imageset/music_2.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "music_3.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_3.imageset/music_3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/music_3.imageset/music_3.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "music_4.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_4.imageset/music_4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/music_4.imageset/music_4.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "music_5.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_5.imageset/music_5.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/music_5.imageset/music_5.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "music_6.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_6.imageset/music_6.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/music_6.imageset/music_6.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "music_sheet_1.jpeg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_1.imageset/music_sheet_1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_1.imageset/music_sheet_1.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "music_sheet_2.jpeg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_2.imageset/music_sheet_2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_2.imageset/music_sheet_2.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "music_sheet_3.jpeg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_3.imageset/music_sheet_3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_3.imageset/music_sheet_3.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "music_sheet_4.jpeg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_4.imageset/music_sheet_4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_4.imageset/music_sheet_4.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_5.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "music_sheet_5.jpeg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_5.imageset/music_sheet_5.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_5.imageset/music_sheet_5.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_6.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "music_sheet_6.jpeg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_6.imageset/music_sheet_6.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/music_sheet_6.imageset/music_sheet_6.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/mv_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "mv_1.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/mv_1.imageset/mv_1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/mv_1.imageset/mv_1.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/mv_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "mv_2.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/mv_2.imageset/mv_2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/mv_2.imageset/mv_2.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/mv_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "mv_3.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/mv_3.imageset/mv_3.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/mv_3.imageset/mv_3.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/mv_4.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "mv_4.jpeg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Assets.xcassets/mv_4.imageset/mv_4.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/Assets.xcassets/mv_4.imageset/mv_4.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/BaseNavigationController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseNavigationController.swift 3 | // MDTableExample 4 | // 5 | // Created by Leo on 2017/7/13. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class BaseNavigationController: UINavigationController{ 13 | override var preferredStatusBarStyle: UIStatusBarStyle{ 14 | get{ 15 | return .lightContent 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/ChannelItemView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionViewCell.swift 3 | // MDTableExample 4 | // 5 | // Created by Leo on 2017/7/10. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ChannelItemView:AvatarItemView{ 12 | 13 | var coverImageview: UIImageView! 14 | var podcasterNameLabel: UILabel! 15 | var describeLabel: UILabel! 16 | func config(_ channel:NMChannel){ 17 | podcasterNameLabel.text = channel.podcasterName 18 | avatarImageView.asyncSetImage(channel.avatar) 19 | describeLabel.text = channel.describe 20 | 21 | } 22 | override init(frame: CGRect) { 23 | super.init(frame: frame) 24 | commonInit() 25 | } 26 | func commonInit(){ 27 | coverImageview = UIImageView().added(to: self) 28 | describeLabel = UILabel.title().added(to: self) 29 | describeLabel.numberOfLines = 2 30 | podcasterNameLabel = UILabel.title().added(to: self) 31 | podcasterNameLabel.textColor = UIColor.white 32 | } 33 | override func layoutSubviews() { 34 | super.layoutSubviews() 35 | avatarImageView.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.width) 36 | coverImageview.frame = avatarImageView.frame 37 | describeLabel.frame = CGRect(x: 4.0, y: avatarImageView.maxY + 4.0, width: self.frame.width - 8.0, height: 30.0) 38 | podcasterNameLabel.sizeToFit() 39 | podcasterNameLabel.frame = CGRect(x: 4.0, y: coverImageview.maxY - 2.0 - podcasterNameLabel.frame.height, width: describeLabel.frame.width, height: podcasterNameLabel.frame.height) 40 | } 41 | required init?(coder aDecoder: NSCoder) { 42 | fatalError("init(coder:) has not been implemented") 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/ColumnTitle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NMHomeColumnCell.swift 3 | // MDTableExample 4 | // 5 | // Created by Leo on 2017/7/6. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import MDTable 11 | 12 | class NMColumnTitleRow: ReactiveRow{ 13 | let columnTitle:String 14 | init(title:String) { 15 | columnTitle = title 16 | super.init() 17 | self.rowHeight = 45.0 18 | self.initalType = .xib(xibName: "NMColumnTitleCell") 19 | } 20 | } 21 | 22 | class NMColumnTitleCell: MDTableViewCell{ 23 | 24 | @IBOutlet weak var columnTitleLabel: UILabel! 25 | override func render(with row: RowConvertable) { 26 | guard let _row = row as? NMColumnTitleRow else { 27 | return 28 | } 29 | self.columnTitleLabel.text = _row.columnTitle 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/CusomCellWithXib.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CusomCellWithXib.swift 3 | // MDTableExample 4 | // 5 | // Created by Leo on 2017/6/15. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import MDTable 11 | 12 | class CusomCellWithXib: MDTableViewCell{ 13 | 14 | @IBOutlet weak var customSubTitleLabel: UILabel! 15 | @IBOutlet weak var customTitleLabel: UILabel! 16 | @IBOutlet weak var avaterImageView: UIImageView! 17 | 18 | override func render(with row: RowConvertable) { 19 | guard let row = row as? XibRow else{ 20 | return; 21 | } 22 | customTitleLabel.text = row.title 23 | customSubTitleLabel.text = row.subTitle 24 | avaterImageView.image = row.image 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/CustomCellWithXibController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CustomCellWithXibController.swift 3 | // MDTableExample 4 | // 5 | // Created by Leo on 2017/6/15. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import MDTable 11 | 12 | class CustomCellWithXibController: UITableViewController { 13 | var tableManager:TableManager! 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | navigationItem.title = "Custom cell with XIB" 17 | let rows = (1..<100).map { (index) -> XibRow in 18 | let row = XibRow(title: "Title\(index)", subTitle: "Subtitle \(index)", image: UIImage(named: "avatar")) 19 | row.onDidSelected({ (tableView, indexPath) in 20 | tableView.manager?.delete(row: indexPath) 21 | tableView.deleteRows(at: [indexPath], with: .automatic) 22 | }) 23 | return row 24 | } 25 | let section = Section(rows: rows) 26 | section.heightForHeader = 30.0 27 | section.titleForHeader = "Tap Row to Delete" 28 | tableView.manager = TableManager(sections: [section]) 29 | } 30 | } 31 | 32 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/DynamicHeightCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DynamicHeightCell.swift 3 | // MDTableExample 4 | // 5 | // Created by Leo on 2017/6/16. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import MDTable 11 | 12 | struct DynamicHeightCellConst{ 13 | static let font = UIFont.systemFont(ofSize: 16) 14 | static let cellWidth = UIScreen.main.bounds.size.width - 20.0 15 | } 16 | class DynamicHeightCell: MDTableViewCell { 17 | 18 | var customLabel: UILabel! 19 | override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 20 | super.init(style: style, reuseIdentifier: reuseIdentifier) 21 | customLabel = UILabel(frame: self.contentView.bounds) 22 | customLabel.font = DynamicHeightCellConst.font 23 | customLabel.textColor = UIColor.orange 24 | customLabel.numberOfLines = 0 25 | contentView.addSubview(customLabel) 26 | } 27 | override func layoutSubviews() { 28 | super.layoutSubviews() 29 | customLabel.frame = CGRect(x: 20.0, y: 0, width: contentView.frame.size.width - 20.0, height: contentView.frame.size.height) 30 | } 31 | required init?(coder aDecoder: NSCoder) { 32 | fatalError("init(coder:) has not been implemented") 33 | } 34 | override func render(with row: RowConvertable) { 35 | super.render(with: row) 36 | guard let row = row as? DynamicHeightRow else { 37 | return 38 | } 39 | customLabel.text = row.title 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/DynamicHeightCellController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DynamicHeightCellController.swift 3 | // MDTableExample 4 | // 5 | // Created by Leo on 2017/6/16. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import MDTable 11 | 12 | class DynamicHeightCellController: UITableViewController { 13 | var tableManager:TableManager! 14 | let appendArray = ["Wardell Stephen Curry II (born March 14, 1988) is an American professional basketball player for the Golden State Warriors of the National Basketball Association (NBA). ", 15 | "Many players and analysts have called him the greatest shooter in NBA history.[1] In 2014–15.", 16 | "Curry is the son of former NBA player Dell Curry and older brother of current NBA player Seth Curry.", 17 | "During the 2012–13 season, Curry set the NBA record for three-pointers made in a regular season with 272. He surpassed that record in 2015 with 286, and again in 2016 with 402. During the 2013–14 season, he and teammate Klay Thompson were nicknamed the 'Splash Brothers' en route to setting the NBA record for combined three-pointers in a season with 484, a record they broke the following season (525) and again in the 2015–16 season (678)."] 18 | override func viewDidLoad() { 19 | super.viewDidLoad() 20 | navigationItem.title = "Custom cell with Code" 21 | let rows = (1..<100).map { (index) -> DynamicHeightRow in 22 | let random = Int(arc4random()) % appendArray.count 23 | let content = appendArray[random] 24 | let row = DynamicHeightRow(title: content) 25 | row.didSelectRowAt = { (tableView, indexPath) in 26 | tableView.manager?.delete(row: indexPath) 27 | tableView.deleteRows(at: [indexPath], with: .automatic) 28 | } 29 | return row 30 | } 31 | let section = Section(rows: rows) 32 | section.heightForHeader = 30.0 33 | section.titleForHeader = "Tap Row to Delete" 34 | tableView.manager = TableManager(sections: [section]) 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/DynamicHeightRow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DynamicHeightRow.swift 3 | // MDTableExample 4 | // 5 | // Created by Leo on 2017/6/16. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import MDTable 11 | 12 | class DynamicHeightRow: RowConvertable{ 13 | //Protocol 14 | var rowHeight: CGFloat{ 15 | get{ 16 | let attributes = [NSFontAttributeName: DynamicHeightCellConst.font] 17 | let size = CGSize(width: DynamicHeightCellConst.cellWidth, height: .greatestFiniteMagnitude) 18 | let height = (self.title as NSString).boundingRect(with: size, 19 | options: [.usesLineFragmentOrigin], 20 | attributes: attributes, 21 | context: nil).size.height 22 | return height + 8.0 23 | } 24 | } 25 | var reuseIdentifier: String = "DynamicHeightRow" 26 | var initalType: RowConvertableInitalType = RowConvertableInitalType.code(className: DynamicHeightCell.self) 27 | 28 | //Optional evnet 29 | var didSelectRowAt: (UITableView, IndexPath) -> Void 30 | 31 | //Data 32 | var title:String 33 | init(title:String) { 34 | self.title = title 35 | self.didSelectRowAt = {_,_ in} 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/ExclusiveItemView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ExclusiveCollectionCell.swift 3 | // MDTableExample 4 | // 5 | // Created by Leo on 2017/7/7. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | enum ExclusiveStyle{ 12 | case fullScreen 13 | case halfScreen 14 | } 15 | 16 | class ExclusiveItemView: UIView{ 17 | var avatarImageView: UIImageView! 18 | var describeLabel: UILabel! 19 | var coverImageView:UIImageView! 20 | var discImageView:UIImageView! 21 | var style:ExclusiveStyle = .halfScreen 22 | override init(frame: CGRect) { 23 | super.init(frame: frame) 24 | commonInit() 25 | } 26 | 27 | required init?(coder aDecoder: NSCoder) { 28 | fatalError("init(coder:) has not been implemented") 29 | } 30 | func commonInit(){ 31 | avatarImageView = UIImageView().added(to: self) 32 | coverImageView = UIImageView().added(to: self) 33 | coverImageView.image = UIImage(named: "cm4_cover_top_mask") 34 | describeLabel = UILabel.title().added(to: self) 35 | describeLabel.numberOfLines = 2 36 | discImageView = UIImageView().added(to: self) 37 | discImageView.image = UIImage(named: "cm4_disc_type_video") 38 | } 39 | func config(_ exclusive:NMExclusive,style:ExclusiveStyle){ 40 | self.avatarImageView.asyncSetImage(exclusive.avatar) 41 | self.describeLabel.text = exclusive.describe 42 | self.style = style 43 | setNeedsLayout() 44 | } 45 | override func layoutSubviews() { 46 | super.layoutSubviews() 47 | var aspectRadio:CGFloat = 0.0 48 | switch self.style { 49 | case .halfScreen: 50 | aspectRadio = 158.0 / 87.0 51 | case .fullScreen: 52 | aspectRadio = 320.0 / 115.0 53 | } 54 | avatarImageView.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.width / aspectRadio) 55 | coverImageView.frame = avatarImageView.frame 56 | discImageView.frame = CGRect(x: 4.0, y: 4.0, width: 22.0, height: 22.0) 57 | describeLabel.frame = CGRect(x: 4.0, y: coverImageView.maxY + 4.0, width: self.frame.width - 8.0, height: 35.0) 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/FPS.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FPS.swift 3 | // MDTableExample 4 | // 5 | // Created by Leo on 2017/7/26. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | class FPSLabel : UILabel{ 13 | var displayLink:CADisplayLink! 14 | var lastTimeStamp:CFTimeInterval = -1.0 15 | var countPerFrame:Double = 0.0 16 | override init(frame: CGRect) { 17 | super.init(frame: frame) 18 | displayLink = CADisplayLink(target: self, selector: #selector(FPSLabel.handleDisplayLink(_:))) 19 | displayLink.add(to: RunLoop.main, forMode: .commonModes) 20 | self.font = UIFont.systemFont(ofSize: 14) 21 | self.backgroundColor = UIColor(red: 60.0 / 255.0, green: 145.0 / 255.0, blue: 82.0 / 255.0, alpha: 1.0) 22 | self.textColor = UIColor.white 23 | self.textAlignment = .center 24 | } 25 | func handleDisplayLink(_ sender:CADisplayLink){ 26 | guard lastTimeStamp != -1.0 else { 27 | lastTimeStamp = displayLink.timestamp 28 | return 29 | } 30 | countPerFrame += 1 31 | let interval = displayLink.timestamp - lastTimeStamp 32 | guard interval >= 1.0 else { 33 | return 34 | } 35 | let fps = Int(round(countPerFrame / interval)) 36 | self.text = "\(fps)" 37 | countPerFrame = 0 38 | lastTimeStamp = displayLink.timestamp 39 | } 40 | required init?(coder aDecoder: NSCoder) { 41 | fatalError("init(coder:) has not been implemented") 42 | } 43 | deinit { 44 | displayLink.remove(from: RunLoop.main, forMode: .commonModes) 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | MDTable 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UIStatusBarStyle 32 | UIStatusBarStyleLightContent 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeRight 37 | 38 | UISupportedInterfaceOrientations~ipad 39 | 40 | UIInterfaceOrientationPortrait 41 | UIInterfaceOrientationPortraitUpsideDown 42 | UIInterfaceOrientationLandscapeLeft 43 | UIInterfaceOrientationLandscapeRight 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/MusicItemView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MusicCollectionCell.swift 3 | // MDTableExample 4 | // 5 | // Created by Leo on 2017/7/11. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | enum MusicCollectionCellStyle { 12 | case normal 13 | case slogen 14 | } 15 | class MusicItemView: AvatarItemView { 16 | var titleLabel: UILabel! 17 | var subTitleLabel: UILabel! 18 | var coverImageView: UIImageView! 19 | 20 | override init(frame: CGRect) { 21 | super.init(frame: frame) 22 | commonInit() 23 | } 24 | func commonInit(){ 25 | coverImageView = UIImageView(frame: CGRect.zero).added(to: self) 26 | titleLabel = UILabel.title().added(to: self) 27 | subTitleLabel = UILabel.subTitle().added(to: self) 28 | } 29 | override func layoutSubviews() { 30 | super.layoutSubviews() 31 | avatarImageView.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.width) 32 | coverImageView.frame = avatarImageView.frame 33 | titleLabel.frame = CGRect(x: 4.0, y: avatarImageView.maxY + 4.0, width: self.frame.width - 8.0, height: 15.0) 34 | subTitleLabel.frame = CGRect(x: 4.0, y: titleLabel.maxY + 2.0, width: self.frame.width - 8.0, height: 15.0) 35 | } 36 | required init?(coder aDecoder: NSCoder) { 37 | fatalError("init(coder:) has not been implemented") 38 | } 39 | 40 | func config(_ music:NMLatestMusic, style:MusicCollectionCellStyle){ 41 | switch style { 42 | case .normal: 43 | coverImageView.isHidden = true 44 | default: 45 | coverImageView.image = UIImage(named: "cm4_disc_cover_new") 46 | coverImageView.isHidden = false 47 | } 48 | avatarImageView.asyncSetImage(music.avatar) 49 | titleLabel.text = music.title 50 | subTitleLabel.text = music.subTitle 51 | } 52 | } 53 | 54 | //新歌推荐 55 | class NMLatestMusic { 56 | var avatar:UIImage? 57 | var title:String 58 | var subTitle:String 59 | init(avatar:UIImage?, title:String,subTitle:String){ 60 | self.avatar = avatar 61 | self.title = title 62 | self.subTitle = subTitle 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/PlaceHolder.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/MDTableExample/PlaceHolder.jpeg -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/ReorderTableViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwipteToDeleteController.swift 3 | // MDTableExample 4 | // 5 | // Created by Leo on 2017/6/16. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import MDTable 11 | 12 | class ReorderRow: Row, EditableRow{ 13 | var titleForDeleteConfirmationButton: String? = nil 14 | var editingStyle:UITableViewCellEditingStyle = .none 15 | var canMove: Bool = true 16 | var shouldIndentWhileEditing: Bool = false 17 | } 18 | 19 | class ReorderTableViewController: UITableViewController { 20 | var tableManager:TableManager! 21 | 22 | override func viewDidLoad() { 23 | super.viewDidLoad() 24 | tableView.allowsSelectionDuringEditing = false 25 | navigationItem.title = "Reorder" 26 | tableView.setEditing(true, animated: false) 27 | let rows = (1..<100).map { (index) -> ReorderRow in 28 | let row = ReorderRow(title: "\(index)") 29 | return row 30 | } 31 | let section = Section(rows: rows) 32 | section.heightForHeader = 0.0 33 | let editor = TableEditor() 34 | editor.moveRowAtSourceIndexPathToDestinationIndexPath = {(tableView,sourceIndexPath,destinationIndexPath) in 35 | tableView.manager?.move(from: sourceIndexPath, to: destinationIndexPath) 36 | } 37 | tableView.manager = TableManager(sections: [section],editor:editor) 38 | } 39 | } 40 | 41 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/SectionIndexTitleController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SectionIndexTitleController.swift 3 | // MDTableExample 4 | // 5 | // Created by Leo on 2017/6/17. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import MDTable 11 | 12 | class SectionIndexTitleController: UITableViewController { 13 | var tableManager:TableManager! 14 | 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | tableView.allowsSelectionDuringEditing = false 18 | navigationItem.title = "Index Titles" 19 | 20 | var sections = [Section]() 21 | for secionTitle in ["A","B","C","E","G","H","K","M","Z"]{ 22 | var rows = [Row]() 23 | (1..<5).forEach{ (index) in 24 | rows.append(Row(title: "\(index)")) 25 | } 26 | let section = Section(rows: rows) 27 | section.heightForHeader = 30.0 28 | section.titleForHeader = secionTitle 29 | section.sectionIndexTitle = secionTitle 30 | sections.append(section) 31 | } 32 | tableView.manager = TableManager(sections: sections) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/SortableSection.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SortableSection.swift 3 | // MDTableExample 4 | // 5 | // Created by Leo on 2017/7/13. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | protocol SortableSection { 12 | var sortTitle: String {get set} 13 | var sequence: Int {get set} 14 | var defaultSequeue:Int {get} 15 | var identifier: String {get} 16 | } 17 | -------------------------------------------------------------------------------- /参考/MDTable-master/MDTableExample/XibRow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // XibRow.swift 3 | // MDTableExample 4 | // 5 | // Created by Leo on 2017/6/15. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import MDTable 11 | 12 | class XibRow:ReactiveRow{ 13 | 14 | //Data 15 | var title:String 16 | var subTitle:String 17 | var image:UIImage? 18 | init(title:String, subTitle:String, image:UIImage?) { 19 | self.title = title 20 | self.subTitle = subTitle 21 | self.image = image 22 | super.init() 23 | self.rowHeight = 80.0 24 | self.initalType = RowConvertableInitalType.xib(xibName: "CusomCellWithXib") 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /参考/MDTable-master/Screenshot/MainList.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/MDTable-master/Screenshot/MainList.png -------------------------------------------------------------------------------- /参考/MDTable-master/Source/Cell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MDCellRenderable.swift 3 | // MDTableView 4 | // 5 | // Created by Leo on 2017/6/15. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | 12 | open class MDTableViewCell:UITableViewCell{ 13 | public typealias MDRowDataType = Row 14 | open func render(with row: RowConvertable) { 15 | if let row = row as? Row{ 16 | self.textLabel?.text = row.title 17 | self.imageView?.image = row.image 18 | self.detailTextLabel?.text = row.detailTitle 19 | self.accessoryType = row.accessoryType 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /参考/MDTable-master/Source/Focus.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Focus.swift 3 | // MDTable 4 | // 5 | // Created by Leo on 2017/7/3. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | 13 | public protocol TableFocusManager{ 14 | func tableView(_ tableView: UITableView, canFocusRowAt indexPath: IndexPath) -> Bool 15 | @available(iOS 9.0, *) 16 | func tableView(_ tableView: UITableView, shouldUpdateFocusIn context: UITableViewFocusUpdateContext) -> Bool 17 | @available(iOS 9.0, *) 18 | func tableView(_ tableView: UITableView, didUpdateFocusIn context: UITableViewFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) 19 | func indexPathForPreferredFocusedView(in tableView: UITableView) -> IndexPath? 20 | } 21 | -------------------------------------------------------------------------------- /参考/MDTable-master/Source/Menu.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Menu.swift 3 | // MDTable 4 | // 5 | // Created by Leo on 2017/7/3. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | 13 | public protocol TableMenuManager{ 14 | 15 | func tableView(_ tableView: UITableView, shouldShowMenuForRowAt indexPath: IndexPath) -> Bool 16 | 17 | func tableView(_ tableView: UITableView, canPerformAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) -> Bool 18 | 19 | func tableView(_ tableView: UITableView, performAction action: Selector, forRowAt indexPath: IndexPath, withSender sender: Any?) 20 | } 21 | 22 | 23 | -------------------------------------------------------------------------------- /参考/MDTable-master/Source/Preload.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Preload.swift 3 | // MDTable 4 | // 5 | // Created by Leo on 2017/7/13. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Preload a row and save it to memory. So that when you scroll, you do not need to create this object any more. 12 | class TablePreloader{ 13 | var preloadMap = [String:UITableViewCell]() 14 | var lock:NSRecursiveLock = NSRecursiveLock() 15 | func preload(_ row:RowConvertable,tableView:UITableView){ 16 | assert(Thread.isMainThread) 17 | switch row.initalType{ 18 | case .code(let cellClass): 19 | let cell = cellClass.init(style: row.cellStyle, reuseIdentifier: row.reuseIdentifier) 20 | preloadMap[row.reuseIdentifier] = cell 21 | case .xib(let xibName): 22 | let nib = UINib(nibName: xibName, bundle: Bundle.main) 23 | tableView.register(nib, forCellReuseIdentifier: row.reuseIdentifier) 24 | let cell = tableView.dequeueReusableCell(withIdentifier: row.reuseIdentifier) 25 | preloadMap[row.reuseIdentifier] = cell 26 | } 27 | } 28 | func reset(){ 29 | lock.lock(); defer{ lock.unlock() } 30 | preloadMap.removeAll() 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /参考/MDTable-master/Source/Row.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseRow.swift 3 | // MDTable 4 | // 5 | // Created by Leo on 2017/7/3. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit 11 | 12 | open class Row:ReactiveRow{ 13 | public var image:UIImage? 14 | public var title:String 15 | public var detailTitle:String? 16 | public var accessoryType: UITableViewCellAccessoryType 17 | public var cellStyle: UITableViewCellStyle = .default 18 | public init(title:String, 19 | image:UIImage? = nil, 20 | detailTitle:String? = nil, 21 | rowHeight:CGFloat = 44.0, 22 | accessoryType: UITableViewCellAccessoryType = .none) { 23 | self.image = image 24 | self.title = title 25 | self.detailTitle = detailTitle 26 | self.accessoryType = accessoryType 27 | super.init() 28 | self.rowHeight = rowHeight 29 | self.accessoryType = accessoryType 30 | } 31 | } 32 | 33 | -------------------------------------------------------------------------------- /参考/MDTable-master/Source/Table.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MDTable.swift 3 | // MDTableView 4 | // 5 | // Created by Leo on 2017/6/15. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import ObjectiveC 11 | 12 | struct MDTableConst{ 13 | static let associatedKey = UnsafeRawPointer.init(bitPattern: "MDTableAccessoryKey".hashValue) 14 | } 15 | public extension UITableView{ 16 | var manager:TableManager?{ 17 | get{ 18 | return objc_getAssociatedObject(self,MDTableConst.associatedKey) as? TableManager 19 | }set{ 20 | asyncExecuteOnMain { 21 | newValue?.bindTo(tableView: self) 22 | objc_setAssociatedObject(self, MDTableConst.associatedKey, newValue, .OBJC_ASSOCIATION_RETAIN) 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /参考/MDTable-master/Source/Util.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Util.swift 3 | // MDTable 4 | // 5 | // Created by Leo on 2017/7/27. 6 | // Copyright © 2017年 Leo Huang. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | func asyncExecuteOnMain(_ block:@escaping (Void)->Void){ 12 | if Thread.isMainThread{ 13 | block() 14 | }else{ 15 | DispatchQueue.main.async { 16 | block() 17 | } 18 | } 19 | } 20 | 21 | func syncExecuteOnMain(_ block:@escaping (Void)->Void){ 22 | if Thread.isMainThread{ 23 | block() 24 | }else{ 25 | DispatchQueue.main.sync { 26 | block() 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/.DS_Store -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/project.xcworkspace/xcuserdata/critz.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/project.xcworkspace/xcuserdata/critz.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/project.xcworkspace/xcuserdata/ernesto.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/project.xcworkspace/xcuserdata/ernesto.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/project.xcworkspace/xcuserdata/lboaro.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/project.xcworkspace/xcuserdata/lboaro.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/project.xcworkspace/xcuserdata/macmini.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/project.xcworkspace/xcuserdata/macmini.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/project.xcworkspace/xcuserdata/pierre.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/project.xcworkspace/xcuserdata/pierre.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/project.xcworkspace/xcuserdata/shenjie.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/project.xcworkspace/xcuserdata/shenjie.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/project.xcworkspace/xcuserdata/xwu.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/project.xcworkspace/xcuserdata/xwu.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/xcshareddata/IDETemplateMacros.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | FILEHEADER 6 | / Copyright (c) ___YEAR___ Razeware LLC 7 | /// 8 | /// Permission is hereby granted, free of charge, to any person obtaining a copy 9 | /// of this software and associated documentation files (the "Software"), to deal 10 | /// in the Software without restriction, including without limitation the rights 11 | /// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | /// copies of the Software, and to permit persons to whom the Software is 13 | /// furnished to do so, subject to the following conditions: 14 | /// 15 | /// The above copyright notice and this permission notice shall be included in 16 | /// all copies or substantial portions of the Software. 17 | /// 18 | /// Notwithstanding the foregoing, you may not use, copy, modify, merge, publish, 19 | /// distribute, sublicense, create a derivative work, and/or sell copies of the 20 | /// Software in any work that is designed, intended, or marketed for pedagogical or 21 | /// instructional purposes related to programming, coding, application development, 22 | /// or information technology. Permission for such use, copying, modification, 23 | /// merger, publication, distribution, sublicensing, creation of derivative works, 24 | /// or sale is expressly withheld. 25 | /// 26 | /// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 27 | /// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 28 | /// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 29 | /// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 30 | /// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 31 | /// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 32 | /// THE SOFTWARE. 33 | 34 | 35 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/xcuserdata/shenjie.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ModeratorsExplorer.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | D2A5F1FF1F4A9144005CD714 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/xcuserdata/xwu.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer.xcodeproj/xcuserdata/xwu.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ModeratorsExplorer.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/.DS_Store -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/AlertDisplayer.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | import UIKit 4 | 5 | protocol AlertDisplayer { 6 | func displayAlert(with title: String, message: String, actions: [UIAlertAction]?) 7 | } 8 | 9 | extension AlertDisplayer where Self: UIViewController { 10 | func displayAlert(with title: String, message: String, actions: [UIAlertAction]? = nil) { 11 | guard presentedViewController == nil else { 12 | return 13 | } 14 | 15 | let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) 16 | actions?.forEach { action in 17 | alertController.addAction(action) 18 | } 19 | present(alertController, animated: true) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | 2 | import UIKit 3 | 4 | @UIApplicationMain 5 | class AppDelegate: UIResponder, UIApplicationDelegate { 6 | var window: UIWindow? 7 | } 8 | 9 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/.DS_Store -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon1024.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon20.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon20@2x.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon29.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon29@2x.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon40.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon40@2x.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon76.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon76@2x.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/Icon83.5@2x.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/icon-app-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/icon-app-20@2x.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/icon-app-20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/icon-app-20@3x.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/icon-app-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/icon-app-29@2x.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/icon-app-29@3x copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/icon-app-29@3x copy.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/icon-app-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/icon-app-40@2x.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/icon-app-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/icon-app-40@3x.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/icon-app-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/icon-app-60@2x.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/icon-app-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/AppIcon.appiconset/icon-app-60@3x.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/rw-logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "Razewarelogo_1024.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/rw-logo.imageset/Razewarelogo_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/rw-logo.imageset/Razewarelogo_1024.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/rwdevcon-bg.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "rwdevcon-bg.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/rwdevcon-bg.imageset/rwdevcon-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/rwdevcon-bg.imageset/rwdevcon-bg.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/se-icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "se-icon.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/se-icon.imageset/se-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Assets.xcassets/se-icon.imageset/se-icon.png -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/ButtonEnablingBehavior.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | import UIKit 4 | 5 | final class ButtonEnablingBehavior: NSObject { 6 | let textFields: [UITextField] 7 | 8 | let onChange: (Bool) -> Void 9 | 10 | init(textFields: [UITextField], onChange: @escaping (Bool) -> Void) { 11 | self.textFields = textFields 12 | self.onChange = onChange 13 | super.init() 14 | setup() 15 | } 16 | 17 | private func setup() { 18 | textFields.forEach { textField in 19 | textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged) 20 | } 21 | onChange(false) 22 | } 23 | 24 | @objc func textFieldDidChange(_ textField: UITextField) { 25 | var enable = true 26 | for textField in textFields { 27 | guard let text = textField.text, !text.isEmpty else { 28 | enable = false 29 | break 30 | } 31 | } 32 | onChange(enable) 33 | } 34 | } 35 | 36 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/ColorPalette.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | import UIKit 4 | 5 | struct ColorPalette { 6 | static let RWGreen = UIColor(red: CGFloat(0), green: CGFloat(104/255.0), blue: CGFloat(55/255.0), alpha: CGFloat(1.0)) 7 | } 8 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Controllers/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Controllers/.DS_Store -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Controllers/ModeratorsSearchViewController.swift: -------------------------------------------------------------------------------- 1 | 2 | import UIKit 3 | 4 | class ModeratorsSearchViewController: UIViewController { 5 | private enum SegueIdentifiers { 6 | static let list = "ListViewController" 7 | } 8 | 9 | @IBOutlet var siteTextField: UITextField! 10 | @IBOutlet var searchButton: UIButton! 11 | 12 | private var behavior: ButtonEnablingBehavior! 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | 17 | title = NSLocalizedString("Search", comment: "") 18 | 19 | behavior = ButtonEnablingBehavior(textFields: [siteTextField]) { [unowned self] enable in 20 | if enable { 21 | self.searchButton.isEnabled = true 22 | self.searchButton.alpha = 1 23 | } else { 24 | self.searchButton.isEnabled = false 25 | self.searchButton.alpha = 0.7 26 | } 27 | } 28 | 29 | siteTextField.setBottomBorder() 30 | } 31 | 32 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 33 | if segue.identifier == SegueIdentifiers.list { 34 | if let listViewController = segue.destination as? ModeratorsListViewController { 35 | listViewController.site = siteTextField.text! 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Double+Extensions.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | 4 | extension Double { 5 | static let formatter: NumberFormatter = { 6 | let formatter = NumberFormatter() 7 | formatter.numberStyle = NumberFormatter.Style.decimal 8 | return formatter 9 | }() 10 | 11 | var formatted: String { 12 | return Double.formatter.string(for: self) ?? String(self) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/HTTPURLResponse.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | 4 | extension HTTPURLResponse { 5 | var hasSuccessStatusCode: Bool { 6 | return 200...299 ~= statusCode 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | NSAppTransportSecurity 24 | 25 | NSAllowsArbitraryLoads 26 | 27 | 28 | UILaunchStoryboardName 29 | LaunchScreen 30 | UIMainStoryboardFile 31 | Main 32 | UIRequiredDeviceCapabilities 33 | 34 | armv7 35 | 36 | UISupportedInterfaceOrientations 37 | 38 | UIInterfaceOrientationPortrait 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UISupportedInterfaceOrientations~ipad 43 | 44 | UIInterfaceOrientationPortrait 45 | UIInterfaceOrientationPortraitUpsideDown 46 | UIInterfaceOrientationLandscapeLeft 47 | UIInterfaceOrientationLandscapeRight 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Models/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Models/.DS_Store -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Models/Moderator.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | 4 | struct Moderator: Decodable { 5 | let displayName: String 6 | let reputation: String 7 | 8 | enum CodingKeys: String, CodingKey { 9 | case displayName = "display_name" 10 | case reputation 11 | } 12 | 13 | init(displayName: String, reputation: String) { 14 | self.displayName = displayName 15 | self.reputation = reputation 16 | } 17 | 18 | init(from decoder: Decoder) throws { 19 | let container = try decoder.container(keyedBy: CodingKeys.self) 20 | let displayName = try container.decode(String.self, forKey: .displayName) 21 | let reputation = try container.decode(Double.self, forKey: .reputation) 22 | self.init(displayName: displayName.html2String, reputation: reputation.formatted) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Services/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Services/.DS_Store -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Services/Networking/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Services/Networking/.DS_Store -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Services/Networking/DataResponseError.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | 4 | enum DataResponseError: Error { 5 | case network 6 | case decoding 7 | 8 | var reason: String { 9 | switch self { 10 | case .network: 11 | return "An error occurred while fetching data ".localizedString 12 | case .decoding: 13 | return "An error occurred while decoding data".localizedString 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Services/Networking/ModeratorRequest.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | 4 | struct ModeratorRequest { 5 | var path: String { 6 | return "users/moderators" 7 | } 8 | 9 | let parameters: Parameters 10 | private init(parameters: Parameters) { 11 | self.parameters = parameters 12 | } 13 | } 14 | 15 | extension ModeratorRequest { 16 | static func from(site: String) -> ModeratorRequest { 17 | let defaultParameters = ["order": "desc", "sort": "reputation", "filter": "!-*jbN0CeyJHb"] 18 | let parameters = ["site": "\(site)"].merging(defaultParameters, uniquingKeysWith: +) 19 | return ModeratorRequest(parameters: parameters) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Services/Networking/PagedModeratorResponse.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | 4 | struct PagedModeratorResponse: Decodable { 5 | let moderators: [Moderator] 6 | let total: Int 7 | let hasMore: Bool 8 | let page: Int 9 | 10 | enum CodingKeys: String, CodingKey { 11 | case moderators = "items" 12 | case hasMore = "has_more" 13 | case total 14 | case page 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Services/Networking/URLRequest.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | 4 | typealias Parameters = [String: String] 5 | 6 | extension URLRequest { 7 | func encode(with parameters: Parameters?) -> URLRequest { 8 | guard let parameters = parameters else { 9 | return self 10 | } 11 | 12 | var encodedURLRequest = self 13 | 14 | if let url = self.url, 15 | let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false), 16 | !parameters.isEmpty { 17 | var newUrlComponents = urlComponents 18 | let queryItems = parameters.map { key, value in 19 | URLQueryItem(name: key, value: value) 20 | } 21 | newUrlComponents.queryItems = queryItems 22 | encodedURLRequest.url = newUrlComponents.url 23 | return encodedURLRequest 24 | } else { 25 | return self 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Services/Result.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | 4 | enum Result { 5 | case success(T) 6 | case failure(U) 7 | } 8 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Services/StackExchangeClient.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | 4 | final class StackExchangeClient { 5 | private lazy var baseURL: URL = { 6 | return URL(string: "http://api.stackexchange.com/2.2/")! 7 | }() 8 | 9 | let session: URLSession 10 | 11 | init(session: URLSession = URLSession.shared) { 12 | self.session = session 13 | } 14 | 15 | func fetchModerators(with request: ModeratorRequest, page: Int, completion: @escaping (Result) -> Void) { 16 | 17 | let urlRequest = URLRequest(url: baseURL.appendingPathComponent(request.path)) 18 | let parameters = ["page": "\(page)"].merging(request.parameters, uniquingKeysWith: +) 19 | let encodedURLRequest = urlRequest.encode(with: parameters) 20 | 21 | session.dataTask(with: encodedURLRequest, completionHandler: { (data, response, error) in 22 | guard 23 | let httpResponse = response as? HTTPURLResponse, 24 | httpResponse.hasSuccessStatusCode, 25 | let data = data 26 | else { 27 | completion(Result.failure(DataResponseError.network)) 28 | return 29 | } 30 | 31 | guard let decodedResponse = try? JSONDecoder().decode(PagedModeratorResponse.self, from: data) else { 32 | completion(Result.failure(DataResponseError.decoding)) 33 | return 34 | } 35 | 36 | completion(Result.success(decodedResponse)) 37 | 38 | }).resume() 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/String+Extensions.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | 4 | extension String { 5 | var localizedString: String { 6 | return NSLocalizedString(self, comment: "") 7 | } 8 | 9 | var html2String: String { 10 | guard let data = data(using: .utf8), let attributedString = try? NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil) else { 11 | return self 12 | } 13 | return attributedString.string 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/UITextField+Extensions.swift: -------------------------------------------------------------------------------- 1 | 2 | import Foundation 3 | import UIKit 4 | 5 | extension UITextField { 6 | func setBottomBorder() { 7 | borderStyle = .none 8 | layer.backgroundColor = UIColor.white.cgColor 9 | 10 | layer.masksToBounds = false 11 | 12 | layer.shadowColor = ColorPalette.RWGreen.cgColor 13 | layer.shadowOffset = CGSize(width: 0.0, height: 1.0) 14 | layer.shadowOpacity = 1.0 15 | layer.shadowRadius = 0.0 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/ViewModels/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/ViewModels/.DS_Store -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Views/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/ModeratorsExplorer-master/ModeratorsExplorer/Views/.DS_Store -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/ModeratorsExplorer/Views/ModeratorTableViewCell.swift: -------------------------------------------------------------------------------- 1 | 2 | import UIKit 3 | 4 | class ModeratorTableViewCell: UITableViewCell { 5 | @IBOutlet var displayNameLabel: UILabel! 6 | @IBOutlet var reputationLabel: UILabel! 7 | @IBOutlet var reputationContainerView: UIView! 8 | @IBOutlet var indicatorView: UIActivityIndicatorView! 9 | 10 | override func prepareForReuse() { 11 | super.prepareForReuse() 12 | 13 | configure(with: .none) 14 | } 15 | 16 | override func awakeFromNib() { 17 | super.awakeFromNib() 18 | 19 | reputationContainerView.backgroundColor = .lightGray 20 | reputationContainerView.layer.cornerRadius = 6 21 | 22 | indicatorView.hidesWhenStopped = true 23 | indicatorView.color = ColorPalette.RWGreen 24 | } 25 | 26 | func configure(with moderator: Moderator?) { 27 | if let moderator = moderator { 28 | displayNameLabel?.text = moderator.displayName 29 | reputationLabel?.text = moderator.reputation 30 | displayNameLabel.alpha = 1 31 | reputationContainerView.alpha = 1 32 | indicatorView.stopAnimating() 33 | } else { 34 | displayNameLabel.alpha = 0 35 | reputationContainerView.alpha = 0 36 | indicatorView.startAnimating() 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /参考/ModeratorsExplorer-master/README.md: -------------------------------------------------------------------------------- 1 | # ModeratorsExplorer 2 | 3 | UITableView Infinite Scrolling 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /参考/NukeDemo-main/.gitignore: -------------------------------------------------------------------------------- 1 | ## System 2 | .DS_Store 3 | 4 | ## Build generated 5 | build/ 6 | DerivedData 7 | Nuke.xcodeproj/xcshareddata/xcbaselines/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata 19 | 20 | ## Other 21 | *.xccheckout 22 | *.moved-aside 23 | *.xcuserstate 24 | *.xcscmblueprint 25 | 26 | ## Obj-C/Swift specific 27 | *.hmap 28 | *.ipa 29 | 30 | ## Playgrounds 31 | timeline.xctimeline 32 | playground.xcworkspace 33 | 34 | 35 | ## Swift Package Manager 36 | # 37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 38 | # Packages/ 39 | 40 | .build/ 41 | 42 | 43 | ## CocoaPods 44 | # 45 | # We recommend against adding the Pods directory to your .gitignore. However 46 | # you should judge for yourself, the pros and cons are mentioned at: 47 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 48 | # 49 | 50 | Pods/ 51 | 52 | 53 | ## Carthage 54 | # 55 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 56 | 57 | Carthage 58 | -------------------------------------------------------------------------------- /参考/NukeDemo-main/NukeDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /参考/NukeDemo-main/NukeDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /参考/NukeDemo-main/NukeDemo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "Alamofire", 6 | "repositoryURL": "https://github.com/Alamofire/Alamofire", 7 | "state": { 8 | "branch": null, 9 | "revision": "eaf6e622dd41b07b251d8f01752eab31bc811493", 10 | "version": "5.4.1" 11 | } 12 | }, 13 | { 14 | "package": "FetchImage", 15 | "repositoryURL": "https://github.com/kean/FetchImage.git", 16 | "state": { 17 | "branch": "master", 18 | "revision": "68f136bc6c0f8ed3f5d4d97650a715dd2bbec0d1", 19 | "version": null 20 | } 21 | }, 22 | { 23 | "package": "Gifu", 24 | "repositoryURL": "https://github.com/kaishin/Gifu.git", 25 | "state": { 26 | "branch": null, 27 | "revision": "0ffe24744cc3d82ab9edece53670d0352c6d5507", 28 | "version": "3.3.0" 29 | } 30 | }, 31 | { 32 | "package": "Nuke", 33 | "repositoryURL": "https://github.com/kean/Nuke", 34 | "state": { 35 | "branch": "master", 36 | "revision": "d5dc8508633b462dd9bf415ec449fd55cdd3a1ae", 37 | "version": null 38 | } 39 | }, 40 | { 41 | "package": "ScrollViewPrefetcher", 42 | "repositoryURL": "https://github.com/kean/ScrollViewPrefetcher", 43 | "state": { 44 | "branch": "main", 45 | "revision": "65fd13d5a6dc90603ba71f9296402b507a192468", 46 | "version": null 47 | } 48 | }, 49 | { 50 | "package": "SwiftSVG", 51 | "repositoryURL": "https://github.com/mchoe/SwiftSVG.git", 52 | "state": { 53 | "branch": null, 54 | "revision": "c3a8866a25ace169ee8e5c037670ba14aa59606f", 55 | "version": "2.3.2" 56 | } 57 | } 58 | ] 59 | }, 60 | "version": 1 61 | } 62 | -------------------------------------------------------------------------------- /参考/NukeDemo-main/README.md: -------------------------------------------------------------------------------- 1 | # Nuke Demo 2 | 3 | To run the demo, open the Xcode project from the repo, and run it. 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/100.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/114.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/144.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/152.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/167.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/20.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/29.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/40.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/50.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/57.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/58.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/60.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/72.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/76.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/80.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/Images.xcassets/AppIcon.appiconset/87.png -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | Nuke Demo 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIMainStoryboardFile 30 | Main 31 | UIRequiredDeviceCapabilities 32 | 33 | armv7 34 | 35 | UISupportedInterfaceOrientations 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationLandscapeLeft 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/baseline.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/baseline.jpeg -------------------------------------------------------------------------------- /参考/NukeDemo-main/Resources/progressive.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/NukeDemo-main/Resources/progressive.jpeg -------------------------------------------------------------------------------- /参考/NukeDemo-main/Sources/AlamofireIntegrationDemoViewController.swift: -------------------------------------------------------------------------------- 1 | // The MIT License (MIT) 2 | // 3 | // Copyright (c) 2015-2021 Alexander Grebenyuk (github.com/kean). 4 | 5 | import UIKit 6 | import Nuke 7 | import Alamofire 8 | 9 | final class AlamofireIntegrationDemoViewController: BasicDemoViewController { 10 | override func viewDidLoad() { 11 | super.viewDidLoad() 12 | 13 | pipeline = ImagePipeline { 14 | $0.dataLoader = AlamofireDataLoader() 15 | $0.imageCache = ImageCache() 16 | } 17 | } 18 | } 19 | 20 | /// Implements data loading using Alamofire framework. 21 | public class AlamofireDataLoader: Nuke.DataLoading { 22 | public let session: Alamofire.Session 23 | 24 | /// Initializes the receiver with a given Alamofire.SessionManager. 25 | /// - parameter session: Alamofire.Session.default by default. 26 | public init(session: Alamofire.Session = Alamofire.Session.default) { 27 | self.session = session 28 | } 29 | 30 | // MARK: DataLoading 31 | 32 | /// Loads data using Alamofire.SessionManager. 33 | public func loadData(with request: URLRequest, didReceiveData: @escaping (Data, URLResponse) -> Void, completion: @escaping (Error?) -> Void) -> Cancellable { 34 | // Alamofire.SessionManager automatically starts requests as soon as they are created (see `startRequestsImmediately`) 35 | let task = self.session.streamRequest(request) 36 | task.responseStream { [weak task] stream in 37 | switch stream.event { 38 | case let .stream(result): 39 | switch result { 40 | case let .success(data): 41 | guard let response = task?.response else { return } // Never nil 42 | didReceiveData(data, response) 43 | } 44 | case let .complete(response): 45 | completion(response.error) 46 | } 47 | } 48 | return AnyCancellable { 49 | task.cancel() 50 | } 51 | } 52 | } 53 | 54 | private final class AnyCancellable: Nuke.Cancellable { 55 | let closure: () -> Void 56 | 57 | init(_ closure: @escaping () -> Void) { 58 | self.closure = closure 59 | } 60 | 61 | func cancel() { 62 | closure() 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /参考/NukeDemo-main/Sources/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // The MIT License (MIT) 2 | // 3 | // Copyright (c) 2015-2021 Alexander Grebenyuk (github.com/kean). 4 | 5 | import UIKit 6 | import Nuke 7 | 8 | @UIApplicationMain 9 | class AppDelegate: UIResponder, UIApplicationDelegate { 10 | 11 | var window: UIWindow? 12 | 13 | func applicationDidFinishLaunching(_ application: UIApplication) { 14 | window?.tintColor = UIColor.systemPink 15 | ImagePipeline.Configuration.isSignpostLoggingEnabled = true 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /参考/NukeDemo-main/Sources/DataCachingDemoViewController.swift: -------------------------------------------------------------------------------- 1 | // The MIT License (MIT) 2 | // 3 | // Copyright (c) 2015-2021 Alexander Grebenyuk (github.com/kean). 4 | 5 | import UIKit 6 | import Nuke 7 | 8 | final class DataCachingDemoViewController: BasicDemoViewController { 9 | override func viewDidLoad() { 10 | super.viewDidLoad() 11 | 12 | pipeline = ImagePipeline { 13 | $0.dataLoader = DataLoader(configuration: { 14 | // Disable disk caching built into URLSession 15 | let conf = DataLoader.defaultConfiguration 16 | conf.urlCache = nil 17 | return conf 18 | }()) 19 | 20 | $0.imageCache = ImageCache() 21 | $0.dataCache = try! DataCache(name: "com.github.kean.Nuke.DataCache") 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /参考/NukeDemo-main/Sources/PrefetchingDemoViewController.swift: -------------------------------------------------------------------------------- 1 | // The MIT License (MIT) 2 | // 3 | // Copyright (c) 2015-2021 Alexander Grebenyuk (github.com/kean). 4 | 5 | import UIKit 6 | import Nuke 7 | 8 | private let cellReuseID = "reuseID" 9 | private var loggingEnabled = true 10 | 11 | final class PrefetchingDemoViewController: BasicDemoViewController, UICollectionViewDataSourcePrefetching { 12 | let prefetcher = ImagePrefetcher() 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | 17 | collectionView?.isPrefetchingEnabled = true 18 | collectionView?.prefetchDataSource = self 19 | } 20 | 21 | override func viewWillAppear(_ animated: Bool) { 22 | super.viewWillAppear(animated) 23 | 24 | prefetcher.isPaused = false 25 | } 26 | 27 | override func viewWillDisappear(_ animated: Bool) { 28 | super.viewWillDisappear(animated) 29 | 30 | prefetcher.isPaused = true 31 | } 32 | 33 | // MARK: UICollectionViewDataSourcePrefetching 34 | 35 | func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) { 36 | let urls = indexPaths.map { photos[$0.row] } 37 | prefetcher.startPrefetching(with: urls) 38 | if loggingEnabled { 39 | print("prefetchItemsAt: \(stringForIndexPaths(indexPaths))") 40 | } 41 | } 42 | 43 | func collectionView(_ collectionView: UICollectionView, cancelPrefetchingForItemsAt indexPaths: [IndexPath]) { 44 | let urls = indexPaths.map { photos[$0.row] } 45 | prefetcher.startPrefetching(with: urls) 46 | if loggingEnabled { 47 | print("cancelPrefetchingForItemsAt: \(stringForIndexPaths(indexPaths))") 48 | } 49 | } 50 | } 51 | 52 | private func stringForIndexPaths(_ indexPaths: [IndexPath]) -> String { 53 | guard indexPaths.count > 0 else { 54 | return "[]" 55 | } 56 | let items = indexPaths 57 | .map { return "\(($0 as NSIndexPath).item)" } 58 | .joined(separator: " ") 59 | return "[\(items)]" 60 | } 61 | -------------------------------------------------------------------------------- /参考/NukeDemo-main/Sources/RateLimiterDemoViewController.swift: -------------------------------------------------------------------------------- 1 | // The MIT License (MIT) 2 | // 3 | // Copyright (c) 2015-2021 Alexander Grebenyuk (github.com/kean). 4 | 5 | import UIKit 6 | import Nuke 7 | 8 | private let cellReuseID = "reuseID" 9 | 10 | final class RateLimiterDemoViewController: BasicDemoViewController { 11 | override func viewDidLoad() { 12 | super.viewDidLoad() 13 | 14 | itemsPerRow = 10 15 | 16 | pipeline = ImagePipeline { 17 | let urlSessionConf = URLSessionConfiguration.default 18 | urlSessionConf.urlCache = nil // disable disk cache 19 | $0.dataLoader = DataLoader(configuration: urlSessionConf) 20 | 21 | $0.imageCache = nil // disable memory cache 22 | 23 | $0.isDeduplicationEnabled = false // disable deduplication 24 | } 25 | 26 | for _ in 0..<10 { 27 | photos.append(contentsOf: photos) 28 | } 29 | } 30 | 31 | override func makeRequest(with url: URL, cellSize: CGSize) -> ImageRequest { 32 | return ImageRequest(url: url, processors: [ImageProcessors.Resize(size: cellSize)]) 33 | } 34 | 35 | override func makeImageLoadingOptions() -> ImageLoadingOptions { 36 | return ImageLoadingOptions() // no transition animations 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /参考/NukeDemo-main/Sources/SwiftSVGDemoViewController.swift: -------------------------------------------------------------------------------- 1 | // The MIT License (MIT) 2 | // 3 | // Copyright (c) 2015-2021 Alexander Grebenyuk (github.com/kean). 4 | 5 | import UIKit 6 | import Nuke 7 | import SwiftSVG 8 | 9 | final class SwiftSVGDemoViewController: UIViewController { 10 | override func viewDidLoad() { 11 | super.viewDidLoad() 12 | 13 | view.backgroundColor = UIColor.systemBackground 14 | 15 | ImageDecoderRegistry.shared.register { context in 16 | // Replace this with whatever works for. There are no magic numbers 17 | // for SVG like are used for other binary formats, it's just XML. 18 | let isSVG = context.urlResponse?.url?.absoluteString.hasSuffix(".svg") ?? false 19 | return isSVG ? ImageDecoders.Empty() : nil 20 | } 21 | 22 | let url = URL(string: "https://upload.wikimedia.org/wikipedia/commons/9/9d/Swift_logo.svg")! 23 | 24 | // If you know that all images downloaded by the pipeline are going to be SVG, 25 | // you can just call `loadData(with:)` instead and not register an Empty decoder. 26 | ImagePipeline.shared.loadImage(with: url) { [weak self] result in 27 | guard let self = self, let data = try? result.get().container.data else { 28 | return 29 | } 30 | 31 | // You can render image using whatever size you want, vector! 32 | let targetBounds = CGRect(origin: .zero, size: CGSize(width: 300, height: 300)) 33 | let svgView = UIView(SVGData: data) { layer in 34 | layer.fillColor = UIColor.orange.cgColor 35 | layer.resizeToFit(targetBounds) 36 | } 37 | self.view.addSubview(svgView) 38 | 39 | svgView.bounds = targetBounds 40 | svgView.center = self.view.center 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /参考/TableViewPrefetch-master/.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | # 37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 38 | # Packages/ 39 | # Package.pins 40 | # Package.resolved 41 | .build/ 42 | 43 | # CocoaPods 44 | # 45 | # We recommend against adding the Pods directory to your .gitignore. However 46 | # you should judge for yourself, the pros and cons are mentioned at: 47 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 48 | # 49 | # Pods/ 50 | # 51 | # Add this line if you want to avoid checking in source code from the Xcode workspace 52 | # *.xcworkspace 53 | 54 | # Carthage 55 | # 56 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 57 | # Carthage/Checkouts 58 | 59 | Carthage/Build 60 | 61 | # fastlane 62 | # 63 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 64 | # screenshots whenever they are needed. 65 | # For more information about the recommended setup visit: 66 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 67 | 68 | fastlane/report.xml 69 | fastlane/Preview.html 70 | fastlane/screenshots/**/*.png 71 | fastlane/test_output 72 | 73 | # Code Injection 74 | # 75 | # After new code Injection tools there's a generated folder /iOSInjectionProject 76 | # https://github.com/johnno1962/injectionforxcode 77 | 78 | iOSInjectionProject/ -------------------------------------------------------------------------------- /参考/TableViewPrefetch-master/TableViewPrefetch.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /参考/TableViewPrefetch-master/TableViewPrefetch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /参考/TableViewPrefetch-master/TableViewPrefetch/Models/ImageDataStore.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageDataStore.swift 3 | // TableViewPrefetch 4 | // 5 | // Created by Rokon Uddin on 12/7/18. 6 | // Copyright © 2018 Rokon Uddin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import UIKit.UIImage 11 | 12 | let baseURL = "https://robohash.org/" 13 | 14 | class ImageDataStore { 15 | private var images = (1...200) 16 | .map { ImageModel(url: baseURL+"\($0).png", 17 | order: $0) } 18 | public var numberOfImage: Int { 19 | return images.count 20 | } 21 | 22 | public func loadImage(at index: Int) -> DataLoadOperation? { 23 | if (0.. ())? 33 | private var _image: ImageModel 34 | 35 | init(_ image: ImageModel) { 36 | _image = image 37 | } 38 | 39 | override func main() { 40 | if isCancelled { return } 41 | guard let url = _image.url else { return } 42 | downloadImageFrom(url) { (image) in 43 | DispatchQueue.main.async() { [weak self] in 44 | guard let `self` = self else { return } 45 | if self.isCancelled { return } 46 | self.image = image 47 | self.loadingCompleteHandler?(self.image) 48 | } 49 | } 50 | } 51 | } 52 | 53 | func downloadImageFrom(_ url: URL, completeHandler: @escaping (UIImage?) -> ()) { 54 | URLSession.shared.dataTask(with: url) { data, response, error in 55 | guard 56 | let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200, 57 | let mimeType = response?.mimeType, mimeType.hasPrefix("image"), 58 | let data = data, error == nil, 59 | let _image = UIImage(data: data) 60 | else { return } 61 | completeHandler(_image) 62 | }.resume() 63 | } 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /参考/TableViewPrefetch-master/TableViewPrefetch/Models/ImageModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageModel.swift 3 | // TableViewPrefetch 4 | // 5 | // Created by Rokon Uddin on 12/7/18. 6 | // Copyright © 2018 Rokon Uddin. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct ImageModel { 12 | public private(set) var url: URL? 13 | let order: Int 14 | 15 | init(url: String?, order: Int) { 16 | self.url = url?.toURL 17 | self.order = order 18 | } 19 | } 20 | 21 | public extension String { 22 | var toURL: URL? { 23 | return URL(string: self) 24 | } 25 | } 26 | 27 | -------------------------------------------------------------------------------- /参考/TableViewPrefetch-master/TableViewPrefetch/Other Gubbins/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /参考/TableViewPrefetch-master/TableViewPrefetch/Other Gubbins/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /参考/TableViewPrefetch-master/TableViewPrefetch/Other Gubbins/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /参考/TableViewPrefetch-master/TableViewPrefetch/Views/ImageTableViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageTableViewCell.swift 3 | // TableViewPrefetch 4 | // 5 | // Created by Rokon Uddin on 12/7/18. 6 | // Copyright © 2018 Rokon Uddin. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ImageTableViewCell: UITableViewCell { 12 | @IBOutlet weak var loadingIndicator: UIActivityIndicatorView! 13 | @IBOutlet weak var thumbImageView: UIImageView! 14 | 15 | override func awakeFromNib() { 16 | super.awakeFromNib() 17 | } 18 | 19 | func updateAppearanceFor(_ image: UIImage?) { 20 | DispatchQueue.main.async { [unowned self] in 21 | self.displayImage(image) 22 | } 23 | } 24 | 25 | private func displayImage(_ image: UIImage?) { 26 | if let _image = image { 27 | thumbImageView.image = _image 28 | loadingIndicator.stopAnimating() 29 | } else { 30 | loadingIndicator.startAnimating() 31 | thumbImageView.image = .none 32 | } 33 | } 34 | 35 | } 36 | 37 | -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch.xcodeproj/project.xcworkspace/xcuserdata/shenjie.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/prefetch-master/Prefetch.xcodeproj/project.xcworkspace/xcuserdata/shenjie.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch.xcodeproj/project.xcworkspace/xcuserdata/soul.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/prefetch-master/Prefetch.xcodeproj/project.xcworkspace/xcuserdata/soul.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch.xcodeproj/xcuserdata/shenjie.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Prefetch.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch.xcodeproj/xcuserdata/soul.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Prefetch.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Prefetch 4 | // 5 | // Created by Soul on 16/07/2018. 6 | // Copyright © 2018 Fluffy. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(_ application: UIApplication) { 23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(_ application: UIApplication) { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(_ application: UIApplication) { 33 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(_ application: UIApplication) { 37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 38 | } 39 | 40 | func applicationWillTerminate(_ application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch/Assets.xcassets/row.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "font-awesome_4-7-0_align-justify_16_0_007dff_none.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "font-awesome_4-7-0_align-justify_32_0_007dff_none.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "font-awesome_4-7-0_align-justify_48_0_007dff_none.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch/Assets.xcassets/row.imageset/font-awesome_4-7-0_align-justify_16_0_007dff_none.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/prefetch-master/Prefetch/Assets.xcassets/row.imageset/font-awesome_4-7-0_align-justify_16_0_007dff_none.png -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch/Assets.xcassets/row.imageset/font-awesome_4-7-0_align-justify_32_0_007dff_none.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/prefetch-master/Prefetch/Assets.xcassets/row.imageset/font-awesome_4-7-0_align-justify_32_0_007dff_none.png -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch/Assets.xcassets/row.imageset/font-awesome_4-7-0_align-justify_48_0_007dff_none.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/prefetch-master/Prefetch/Assets.xcassets/row.imageset/font-awesome_4-7-0_align-justify_48_0_007dff_none.png -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch/Model/Coin.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Cryptocurrency.swift 3 | // Prefetch 4 | // 5 | // Created by Soul on 17/07/2018. 6 | // Copyright © 2018 Fluffy. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct CoinList : Decodable { 12 | let data : [String : Coin] 13 | } 14 | 15 | struct Coin : Decodable { 16 | let id : Int 17 | let name : String 18 | let symbol : String 19 | let rank : Int 20 | let quotes : [String : Price] 21 | } 22 | 23 | struct Price : Decodable { 24 | let price : Double 25 | } 26 | -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch/Model/News.swift: -------------------------------------------------------------------------------- 1 | // 2 | // News.swift 3 | // Prefetch 4 | // 5 | // Created by Soul on 16/07/2018. 6 | // Copyright © 2018 Fluffy. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | 12 | struct News: Decodable { 13 | let title: String 14 | let url: String? 15 | let by: String 16 | } 17 | -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch/Model/Post.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Post.swift 3 | // Prefetch 4 | // 5 | // Created by Soul on 17/07/2018. 6 | // Copyright © 2018 Fluffy. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct Post : Decodable { 12 | let userID : Int 13 | let postID : Int 14 | let title : String 15 | let body : String 16 | 17 | enum CodingKeys : String, CodingKey { 18 | case userID = "userId" 19 | case postID = "id" 20 | case title 21 | case body 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch/View/CoinTableViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CoinTableViewCell.swift 3 | // Prefetch 4 | // 5 | // Created by Soul on 17/07/2018. 6 | // Copyright © 2018 Fluffy. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class CoinTableViewCell: UITableViewCell { 12 | 13 | @IBOutlet weak var nameLabel: UILabel! 14 | 15 | @IBOutlet weak var symbolLabel: UILabel! 16 | 17 | @IBOutlet weak var priceLabel: UILabel! 18 | 19 | @IBOutlet weak var rankLabel: UILabel! 20 | 21 | override func awakeFromNib() { 22 | super.awakeFromNib() 23 | // Initialization code 24 | } 25 | 26 | override func setSelected(_ selected: Bool, animated: Bool) { 27 | super.setSelected(selected, animated: animated) 28 | 29 | // Configure the view for the selected state 30 | } 31 | 32 | func configureCell(with coin: Coin){ 33 | self.nameLabel.text = coin.name 34 | self.symbolLabel.text = coin.symbol 35 | self.rankLabel.text = "# \(coin.rank)" 36 | self.priceLabel.text = "$ \(coin.quotes["USD"]!.price)" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch/View/LoadingTableViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoadingTableViewCell.swift 3 | // Prefetch 4 | // 5 | // Created by Soul on 17/07/2018. 6 | // Copyright © 2018 Fluffy. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class LoadingTableViewCell: UITableViewCell { 12 | 13 | @IBOutlet weak var activityIndicator: UIActivityIndicatorView! 14 | 15 | override func awakeFromNib() { 16 | super.awakeFromNib() 17 | // Initialization code 18 | } 19 | 20 | override func setSelected(_ selected: Bool, animated: Bool) { 21 | super.setSelected(selected, animated: animated) 22 | 23 | // Configure the view for the selected state 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch/View/NewsTableViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NewsTableViewCell.swift 3 | // Prefetch 4 | // 5 | // Created by Soul on 16/07/2018. 6 | // Copyright © 2018 Fluffy. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class NewsTableViewCell: UITableViewCell { 12 | 13 | @IBOutlet weak var titleLabel: UILabel! 14 | @IBOutlet weak var urlLabel: UILabel! 15 | @IBOutlet weak var authorLabel: UILabel! 16 | 17 | 18 | override func awakeFromNib() { 19 | super.awakeFromNib() 20 | // Initialization code 21 | } 22 | 23 | override func setSelected(_ selected: Bool, animated: Bool) { 24 | super.setSelected(selected, animated: animated) 25 | 26 | // Configure the view for the selected state 27 | } 28 | 29 | func configureCell(with news: News){ 30 | self.titleLabel.text = news.title 31 | self.urlLabel.text = news.url 32 | self.authorLabel.text = news.by 33 | } 34 | 35 | func truncateCell(){ 36 | self.titleLabel.text = "Loading..." 37 | self.urlLabel.text = "Loading..." 38 | self.authorLabel.text = "Loading..." 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /参考/prefetch-master/Prefetch/View/PostTableViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PostTableViewCell.swift 3 | // Prefetch 4 | // 5 | // Created by Soul on 17/07/2018. 6 | // Copyright © 2018 Fluffy. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class PostTableViewCell: UITableViewCell { 12 | 13 | @IBOutlet weak var titleLabel: UILabel! 14 | @IBOutlet weak var bodyLabel: UILabel! 15 | 16 | 17 | override func awakeFromNib() { 18 | super.awakeFromNib() 19 | // Initialization code 20 | } 21 | 22 | override func setSelected(_ selected: Bool, animated: Bool) { 23 | super.setSelected(selected, animated: animated) 24 | 25 | // Configure the view for the selected state 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /参考/prefetch-master/README.md: -------------------------------------------------------------------------------- 1 | # Prefetch sample project 2 | 3 | Sample iOS Project using UITableViewDataSourcePrefetch 4 | 5 | ![screenshot](screenshot.png) 6 | -------------------------------------------------------------------------------- /参考/prefetch-master/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ShenJieSuzhou/PreloadDemo/d39fc02a550d98d1b972652b042e36ab639b5b1e/参考/prefetch-master/screenshot.png --------------------------------------------------------------------------------