Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
15分でわかる バックグラウンドアップロード
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
yimajo
September 17, 2017
Technology
3k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
15分でわかる バックグラウンドアップロード
iosdc2017 の発表資料です
yimajo
September 17, 2017
More Decks by yimajo
See All by yimajo
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
330
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
910
いま中途半端なSwift 6対応をするより、Default ActorやApproachable Concurrencyを有効にしてからでいいんじゃない?
yimajo
2
730
11年かかって やっとVibe Codingに 時代が追いつきましたね
yimajo
1
400
iOSアプリ開発で 関数型プログラミングを実現する The Composable Architectureの紹介
yimajo
3
340
良いテストコードのために悪いテストコードを理解する - 不安定なテスト編: iOSアプリ開発ユニットテストの場合
yimajo
22
6.8k
TCAの Shared Stateって どういう仕組みになってんの?
yimajo
0
2.7k
Swift 5.9 からの Observation はiOS17 未満 からも使えて struct の変更検知もできるんすかね?
yimajo
2
1.2k
不安定なテストは200種類あんねん
yimajo
3
1.2k
Other Decks in Technology
See All in Technology
Claude Teamプランの コスト最適化を考える
rfdnxbro
2
860
1000⼈規模のClaude Enterprise運⽤を「Oktaのグループ」と「Slack」に集約する
sansantech
PRO
1
560
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.5k
Guerilla InnerSource in enterprises, during the AI hype
onenashev
PRO
0
130
『自分で判断できるか』を基準に、プロダクトのハンズオン研修でAI利用の線を引いてみた / Where We Drew the Line on AI in Hands-on Training
honyanya
1
760
VPCでもFloatingIPを使いたいんだ
y_kotani
1
140
IHV like なユースケースへのOpenID Connect 関連仕様の適用事例
optim
0
440
全社に広がるMCPサーバーを、 どう安全に管理するか MCPass開発の舞台裏
mtpooh
3
220
MCPを待つな、パスキーを拡げよう(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
430
20260903 Tokyo Jazug Night #62 | Azure エンジニアよ、 その環境は本当にセキュアか?
olivia_0707
0
190
[RSJ26] Hierarchy-Aware Multimodal Retrieval-Augmented Generation for Embodied Question Answering
keio_smilab
PRO
1
110
Bet AI Day 2026丨Agentは、「金融」という巨大産業の何を変えられるのか
layerx
PRO
0
370
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
830
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
510
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
WENDY [Excerpt]
tessaabrams
12
39k
Abbi's Birthday
coloredviolet
3
9.6k
Bash Introduction
62gerente
615
220k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
310
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Claude Code のすすめ
schroneko
67
230k
Transcript
ͰΘ͔Δ όοΫάϥϯυΞοϓϩʔυ גࣜձࣾΩϡϦΦγςΟιϑτΣΞ J04%$D !ZJNBKP ࠓળۣ ձૣҴాେֶཧֶ෦ૣҴాΩϟϯύε߸ؗձٞࣨ
ෳ͋Δηογϣϯͷத͔ΒબΜͰ͖ ͋Γ͕ͱ͏͍͟͝·͢
wࢿྉޙ΄ͲΣϒ্ʹެ։ͯ͠ϋογϡλάΛ͚ͯπΠʔτΛ ͠·͢!ZJNBKPJPTEDD wࢿྉͷࡱӨࣗ༝Ͱ͕͢ɺը͞Ε͍ͯΔͣͳͷͰ:PV5VCFͰݟ ฦͤΔͣͰ͢ wฏຌͳൃදͳͷͰؾܰʹฉ͍͍ͯͩ͘͞
ͳͥࠓճόοΫάϥϯυͰͷ Ξοϓϩʔυʹ͍ͭͯ ͢ͷ͔ ❓
υΩϡϝϯτ͕গͳ͍
αϯϓϧίʔυ͔ͳΓগͳ͍
όοΫάϥϯυ࣌ͷ ಈ࡞͕σόοάͮ͠Β͍
͜ͷൃදͰʜ
όοΫάϥϯυࣗ ମͷ͓͞Β͍͠·͢
༷ͷ͔ΓͮΒ ͍Λղઆ͠·͢
σόοάʹඞਢͳπʔ ϧΛհ͠·͢
͡ΊͯͰ ࠷Ͱ҆શͳํ๏͕Θ͔Δͱࢥ ͍·͢
͋ΒͨΊ͓ͯ͠ͳ͕͖ w ࣗݾհ w όοΫάϥϯυΞοϓϩʔυͬͯԿʁ w ϓϩδΣΫτͷಋೖͱ։ൃཱͪπʔϧ
ࣗݾհ
͋ΒͨΊͯࣗݾհ wגࣜձࣾΩϡϦΦγςΟιϑτΣΞ wϒʔεεϙϯαʔ w!ZJNBKPʢࠓળۣʣ wJ04͘Β͍͔ΒΞϓϦ͘Β͍
༨ஊΛ͠·͢
͜ͷ෦ೖޱͷઆ໌ ಡΜͩਓ͍·͢ʁ ʮ͜ͷ෦ૣҴాཧֶ෦ͷઃऀɺ ໌ଠه೦ձٞࣨͰ͢ʯ ʢ࣮෦͝ͱʹ໊લ͕͋Γ·͢ʣ
͜ͷձೖޱͷ૾ˠ ໌ଠʢ͚ͨ͏ͪ Ί͍ͨΖ͏ɺ ҆72݄28ʮ18603݄20ʯ ੜ·Ε — ত3ʮ1928ʯ3݄23ʣɺ ݱࡏͷߴݝ ॓ໟࢢग़ͷ໌࣏ɾେਖ਼ظͷ ࣮ۀՈɾऺٞӃٞһɻ ૣҴాେֶཧֶ෦ઃཱऀɻ
ࠓճͷൃදऀˠ @yimajoʢ͍·͡ΐ͏Α͠ͷΓɺ 1981ੜ·Εʣɺ ݱࡏͷߴݝ࢛ສेࢢग़ɻ தֶ࣌΄΅डݧษڧΛ͠ͳ͔ͬͨͨΊ ࣗۙ͘ͷਐֶߍʹਐ·ͣɺ ߴݝ॓ໟߴߍʹਐֶɺ ϒʔεεϙϯαʔ݉εϐʔΧʔ
͕͢͞ӡӦɺΘ͔ͬͯ·͢Ͷ
ӡӦ ʮͨͩͷۮવͰ͢ʯ
ຊ
ͦͦ όοΫάϥϯυΞοϓϩʔυ ͬͯԿʁ
w J04Ҏ߱ͷόοΫάϥϯυΞοϓϩʔυॲཧ w #BDLHSPVOE5SBOTGFS4FSWJDF༻ͷ"1*ͱͯ͠/463-4FTTJPO ͰॲཧΛ࣮Ͱ͖·͢
Ͳ͏͍͏ͱ͖͏ w ଞͷΞϓϦΛ͍ͬͯΔؒࣗͷΞϓϦͰൺֱతେ͖ͳϑΝΠϧ ΛΞοϓϩʔυͰ͖Δ w 4IBSF&YUFOTJPOͰJ04ඪ४ͷࣸਅBQQͳͲଞΞϓϦ͔Βίϯςϯ πΛબΜͰαʔόʔʹΞοϓϩʔυ͢Δࡍʹར༻͢Δͱศར
͔͠͠ ࠷ॳʹݴ͓ͬͯ͘ͱ
บ͕ڧ͍
৭ʑͬͯͳ͍ͱ
ѻ͍ͮΒ͍
όοΫάϥϯυͬͯԿʁ w ΞϓϦ͕ϑΥΞάϥϯυͰͳ͍ͱ͖Ͱ ಈ࡞Ͱ͖Δ w ϑΥΞάϥϯυͰͳ͍ͱݴͬͯɺ 4VTQFOEFEͱ͍͏ঢ়ଶ/PU3VOOJOHͱ ͍͏ঢ়ଶଘࡏͦ͠ͷঢ়ଶಈ࡞͠·ͤΜ w 4VTQFOEFE#BDLHSPVOEͱߦ͖དྷ͠·
͢
όοΫάϥϯυ௨৴ॲཧ ʹؔ͢Δྺ࢙ͷ͓͞Β͍ ݹ͔͘Β͋ΔJ04࣌ͱJ04͔Βͷҧ͍
J04͔࣌ΒͷόοΫάϥϯυ ॲཧԆ w ༗ݶͳλεΫͷԆॲཧʢ&YFDVUJOH'OJUF-FOHUI5BTLTʣ ͱ͍͏ͷ͕͋Γ͜ͷॲཧόοΫάϥϯυঢ়ଶͰॲཧΛߦ͏ w ௨৴͠Α͏ͱࢥ͑Ͱ͖Δ
88%$ ʢJ04Ќൃද࣌ʣ ͷਤΛݟͯΈΔ
J04͔ΒJ04ͷόοΫάϥϯυ࣮ߦ 88%$8IBUTOFXNVMUJUBTLJOHΑΓ όοΫάϥϯυͰλεΫͷ ॲཧԆ࿈ଓ͍ͯͨ͠ ը໘ΛϩοΫͯ͠ J1IPOFΛεϦʔϓ͍ͯ͠ͳ͔ͬͨ όοςϦʔෛՙ͕ߴ͔ͬͨ
J04Ҏ߱ͷόοΫάϥϯυ࣮ߦ 88%$8IBUTOFXNVMUJUBTLJOHΑΓ όοΫάϥϯυͰλεΫͷ ॲཧԆඈͼඈͼʹͳΔ ը໘ΛϩοΫ͢Δͱ J1IPOF4MFFQ͢Δ
J04ͷ࣌ܥྻͰݟΔόοΫάϥϯυ௨৴ J04 J04 ʮ༗ݶλεΫͷॲཧԆʯͰ ͚ͩಈ࡞Մೳ ʮ༗ݶλεΫͷॲཧԆʯͰ ͚ͩಈ࡞Մೳ #BDLHSPVOE5SBOTGFS 4FSWJDF
͜͜·Ͱͷ·ͱΊ w J04͔ΒJ04ؒॲཧԆͰ͖ʹͰ͖ͨ w σόΠεͷෛՙ͕ܹ͍͠ w J04Ҏ߱ॲཧԆΛʹ͘͠ݸผʹઐ༻ͷ"1*Λ ͏Α͏ʹͳͬͨ
όοΫάϥϯυΞοϓ ϩʔυͷ༷ʹ͍ͭͯ
؆୯ͳಛ w ΞοϓϩʔυJ04্ͷΩϡʔʹੵ·Ε੍ޚ͞ΕΔ w ύϑΥʔϚϯε࠷దԽͷͨΊʹγεςϜͷ࠷ྑͰ εέδϡʔϦϯά͞ΕΔ w ࣦഊͨ͠ΒࣗಈϦτϥΠ͞ΕΔ
"QQMF͕ఏ͍ࣔͯ͠ΔόοΫά ϥϯυ௨৴ͷ੍ʹ͍ͭͯ
w /463-4FTTJPOΫϩʔδϟͰͳ͘EFMFHBUFΛ ͏ w Ξοϓϩʔυ͢ΔϑΝΠϧ%BUBΫϥε͔ΒϑΝ Πϧͱͯ͠ग़ྗͯ͠ύεΛ͢ w όοΫάϥϯυ༻ʹͳΔ͘ϢχʔΫͳ*%Λ࡞ ͢Δ ੍
ͳ͔ͥ
ΞϓϦ J04 EFMFHBUFͱͯ͠Πϯελϯε͢ EFMFHBUFͷϝιουݺͼग़͠ σʔϞϯϓϩηε Ξοϓϩʔυ͢ΔϑΝΠϧ w ΞϓϦ͕όοΫάϥϯυͷঢ়ଶͰ Ξοϓϩʔυ͢ΔͨΊɺJ04σʔϞϯ ϓϩηεʹ௨৴ΛͤΔ
ࢀߟ<ॻ੶>্Λࢦ͢ϓϩάϥϚʔͷͨΊͷJ1IPOFΞϓϦ։ൃςΫχοΫJ04ฤ w σʔϞϯϑΝΠϧύεʹΞΫηε ͦ͠ͷϑΝΠϧΛΞοϓϩʔυ͢Δ w ྃ௨σʔϞϯ͕EFMFHBUFϝ ιουΛݺͼग़͢
w ͓ͦΒ͘ɺJ04ͷϓϩηε͕௨৴Λࣝผ͢ΔͨΊ w ͦͷͨΊɺಉ͡*%Λෳಉ࣌ʹͬͯ௨৴͍͚ͯ͠ͳ͍ w ௨৴͕ऴΘ͔ͬͯΒͦͷ*%Λ͍·Θ͢ͷͳ͍ ʢͱࢥ͏ʣ όοΫάϥϯυ*%ΛҰҙʹ ܾΊΔඞཁ͕͋Δཧ༝
ϓϩδΣΫτͷಋೖ
·ͣ͡Ίʹ όοΫάϥϯυͷίʔυྫ
ओཁͳΫϥεͱEFMFHBUF w 63-3FRVFTU w 63-4FTTJPO w 63-4FTTJPO%FMFHBUF w 63-4FTTJPO$POpHVSBUJPO w
63-4FTTJPO5BTL w 63-4FTTJPO%FMFHBUF
/// - Parameter: /// - fileURL: Ξοϓϩʔυ͢ΔσʔλΛϩʔΧϧͰϑΝΠϧԽͨ͠URL /// - identifier:
ϢχʔΫͳID func upload(fileURL: URL, identifier: String) { let config = URLSessionConfiguration.background(withIdentifier: identifier) let session = URLSession(configuration: config, delegate: self, delegateQueue: nil) let request = makeRequest(with: fileURL) let task = session.uploadTask(with: request, fromFile: fileURL) task.resume() } // 1: URLSessionConfigurationΛ࡞ // 2: URLSessionΛ࡞ // 3: URLRequestΛ࡞(ϦΫΤετύϥϝʔλΛΈཱͯΔͨΊϚϧνύʔτͳURLRequestΛ࡞ͬͯฦ͢) // 4: URLSession͔ΒUploadTaskΛऔΓग़͢ʢΞοϓϩʔυ͢ΔϑΝΠϧͷॴ͕ඞཁʣ Ξοϓϩʔυͷखଓ͖
/// Ξοϓϩʔυਐḿ࣌ʹݺͼग़͞ΕΔ func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent:
Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) { /// ΞοϓϩʔυࡁΈͷbyteͰਐḿΛͱΔ… /// task͔ΒΩϟϯηϧͰ͖Δ… } /// Ξοϓϩʔυྃ࣌ʹݺͼग़͞ΕΔ func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { /// task͔ΒεςʔλείʔυΛऔΓग़ͨ͠Γ… /// ྃॲཧ… } ݺͼग़͞ΕΔ%FMFHBUF
͜ΕͰόοΫάϥϯυͰ ΞοϓϩʔυͰ͖·͢
"QQMFͷαϯϓϧίʔυ w /463-4FTTJPOͰ#BDLHSPVOE5SBOTGFSʹΑ Δμϯϩʔυ w ը૾Λμϯϩʔυ͢ΔͷΈ w ͜ΕΛΞοϓϩʔυʹ࣮Λม͑ಈ࡞Λ֬ೝ͢ Δ w
௨৴ϥΠϒϥϦʹཔΒͳ͍΄͏͕ޙʑॿ͔Δʢޙ ड़ʣ 4JNQMF#BDLHSPVOE5SBOTGFS
ʹཱͭπʔϧ w /FUXPSL-JOL$POEJUJPOFSʢ௨৴ঢ়گΛѱ͘ग़དྷ Δʣ w $IBSMFTʢ1SPYZπʔϧʣ w 4XJGUZCFBWFSʢϩάϥΠϒϥϦʣ
w .BDʹΠϯετʔϧ͢ΔϓϩΩγαʔόʔ $IBSMFT w J1IPOFͱಉ͡8J'JͷNBDʹೖΕΔ w 8FC"1*ͷϦΫΤετΛΤϯυϙΠϯτͰ USFFදࣔͯ͘͠ΕΔ w ϦΫΤετ͕࣌ؒΔͷͰαʔόʔଆʹ
͍߹ΘͤΔࡍʹҰؾʹָʹͳͬͨ w D63-ίϚϯυΛੜͰ͖Δ
w αʔόʹϩάΛૹͬͯͦΕΛઐ༻ͷ.BD BQQͰ֬ೝͰ͖Δˠ w Ԇ͕͋ΔͷͰ͋·Γʹཱͨͳ͍ 4XJGUZ#FBWFS w όοΫάϥϯυʹೖΔλΠϛϯάΛϩά Ͱ֬ೝ w
όοΫάϥϯυதͷಈ࡞ΛςΩετग़ྗ
όοΫάϥϯυΞοϓϩʔυ ·ΓͲ͜Ζ
όοΫάϥϯυಈ࡞࣌ͷ UJNFPVU*OUFSWBM'PS3FRVFTUͷ ͕࣌ؒมߋͰ͖ͳ͍ ఘΊͯΔ
λΠϜΞτؔ࿈ͷϓϩύςΟ w UJNFPVU*OUFSWBM'PS3FRVFTU w ϦΫΤετͷλΠϜΞτɻ৽͍͠σʔλΛड ͚औΔͨͼʹϦηοτ͞ΕΔʢ͔ΓͮΒ͍ʣ w UJNFPVU*OUFSWBM'PS3FTPVSDF w Ϧιʔεʹର͢ΔλΠϜΞτɻ͜ͷ࣌ؒͷؒϦ
τϥΠΛ܁Γฦ͠ɺ͜ΕΛ͑ͯ௨৴ΛߦΘͳ͍
UJNFPVU*OUFSWBM'PS3FRVFTUͬͯ͜͏͍͏͜ͱʁ ϦΫΤετ࣌ؒ αʔόͰͷॲཧ࣌ؒ Ϩεϙϯε ࣌ؒ όοΫάϥϯυ࣌ ඵ Ҏ͡Όͳ͍ͱ λΠϜΞτʁ ϦΫΤετ
UJNF
UJNFPVU*OUFSWBM'PS3FTPVSDFͬͯ͜͏͍͏͜ͱ ϦτϥΠ ϦΫΤετ ϦτϥΠ λΠϜΞτΛ͑Δͱ ϦτϥΠऴΘΓ UJNF
ΜͰͳ͍উखͳϦτϥΠ UJNFPVU*OUFSWBM'PS3FTPVSDFΛͯ͘͠ରԠ
UJNFPVU*OUFSWBM'PS3FTPVSDF ͷσϑΥϧτؒ ͗͢
J04͔Βͷ
w ௨৴ͷεέδϡʔϦϯά༻ͷ"1*͕૿͍͑ͯΔ w ௨৴ࢹࣗ͠ಈͰ։࢝ΛΒͤͨΓ w όοΫάϥϯυ࣌ʹࢦఆͨ࣌ؒ͠Ҏ߱ʹ௨৴͢Δ 88%$"EWBODFTJO/FUXPSLJOH 1BSU
͍͞͝ʹ·ͱΊ w όοΫάϥϯυΞοϓϩʔυJ04͔Β͋ΔόοΫάϥϯυॲཧͷԆ ͱࠞಉͦ͠͏ʹͳΔ͕ผ w ผϓϩηεͰಈ࡞͢ΔͷͰ9DPEFҎ֎ͷπʔϧઈରͬͨ΄͏͕͍͍ w ϦτϥΠपΓ͕ະͩʹṖͳͷͰใڞ༗͠·͠ΐ͏
͝ਗ਼ௌ͋Γ͕ͱ͏ ͍͟͝·ͨ͠ ථͷఔΑΖ͓͘͠ئ͍͠·͢