$30 off During Our Annual Pro Sale. View Details »

ユーザインターフェイスと非同期処理

 ユーザインターフェイスと非同期処理

Presented at Bonfire iOS #4

cockscomb

May 15, 2018
Tweet

More Decks by cockscomb

Other Decks in Programming

Transcript

  1. ϢʔβΠϯλʔϑΣΠεͱ

    ඇಉظॲཧ

    View Slide

  2. id:cockscomb
    Ճ౻ਘथ
    גࣜձࣾ͸ͯͳ
    γχΞΞϓϦέʔγϣϯΤϯδχΞ

    View Slide

  3. ࡢࠓ
    w (PPHMF*0͸Ͳ͏Ͱ͔ͨ͠ʁ
    w 88%$͕͍͖ۙͮͯ·ͨ͠Ͷ
    w ͳʹ͕ൃද͞ΕΔָ͔͠ΈͰ͢Ͷ
    w Έͳ͞Μ͸ͲΜͳظ଴Λ͍࣋ͬͯ·͔͢ʁ
    w 88%$͸Ͳ͏Ͱ͚ͨͬ͠

    View Slide

  4. J04
    w "3,JU΍$PSF.-
    w 6*,JU
    w %SBHBOE%SPQ
    w 'JMFT

    View Slide

  5. J04ͷ֓ཁ Ӭ໺఩ٱ

    "3,JU అमҰ

    $PSF.- ٢ా༔Ұ

    4XJGUͷ৽ػೳͱΞοϓσʔτ ஑ాᠳ

    9DPEFͷ৽ػೳ ࡔాߊҰ

    %SBHBOE%SPQ Ճ౻ਘथ

    'JMFTͱ%PDVNFOU#BTFE"QQMJDBUJPO Ճ౻ਘथ

    6*,JUͷΨΠυϥΠϯͷมߋ఺ͱ

    "VUP-BZPVUͷ৽ػೳɺΞοϓσʔτ઒ᬒ༤հ

    $PSF/'$ ؛઒ࠀݾ

    1%',JU ؛઒ࠀݾ

    4JSJ,JU ؛઒ࠀݾ

    )PNF,JUೖ໳ͱJ04ʹ͓͚Δ৽ػೳ ॴ༑ଠ

    .FUBM అमҰ

    "VEJP.FEJBؔ࿈

    ৽ϑϨʔϜϫʔΫͱΞοϓσʔτ Ӭ໺఩ٱ

    View Slide

  6. 63-4FTTJPO5BTL
    open class URLSessionTask : NSObject, NSCopying, ProgressReporting {
    @available(iOS 11.0, *)
    open var progress: Progress { get }
    }

    View Slide

  7. public protocol ProgressReporting : NSObjectProtocol {
    public var progress: Progress { get }
    }

    View Slide

  8. %SBHBOE%SPQ
    open class NSItemProvider : NSObject, NSCopying {
    @available(iOS 11.0, *)
    open func registerDataRepresentation(forTypeIdentifier
    typeIdentifier: String,
    visibility: NSItemProviderRepresentationVisibility,
    loadHandler:
    @escaping ((Data?, Error?) -> Swift.Void) -> Progress?)
    }

    View Slide

  9. View Slide

  10. 1SPHSFTT3FQPSUJOH
    w ඇಉظॲཧͷঢ়گΛϢʔβΠϯλʔϑΣΠεʹ൓өͰ͖Δ
    w "DUJWJUZ*OEJDBUPS΍1SPHSFTT#BSΛදࣔ͢ΔͱΑ͍
    w l)VNBO*OUFSGBDF(VJEFMJOFTr1SPHSFTT*OEJDBUPSTzΑΓ
    w ݱࡏͷ3Y4XJGUͰѻ͏ͷ͸೉͍͠

    View Slide

  11. <2>ͳͥඇಉظʹ͢Δͷʁ

    View Slide

  12. View Slide

  13. <2>ͳͥඇಉظʹ͢Δͷʁ
    ϝΠϯεϨουͷ3VO-PPQΛࢭΊͨ͘ͳ͍͔Β
    ࢭΊͯ͠·͏ͱΧΫΧΫ͢Δ

    View Slide

  14. <2>ΈΜͳ͸Ͳ͏ͯ͠Δʁ

    View Slide

  15. 3FBDUlTVTQFOTFz
    const movieDetailsFetcher = createFetcher(
    fetchMovieDetails
    )
    const MovieDetails: React.SFC = ({id}) => {
    const movie = movieDetailsFetcher.read(id)
    return (


    {movie.title}


    )
    }

    View Slide

  16. 'MVUUFS
    w 3FBDUʹΠϯεύΠΞ
    w %BSUΛ࢖͏

    View Slide

  17. Future fetchAtom(String atomUrl) async {
    var atomXml = await http.read(atomUrl);
    return parse(atomXml);
    }
    class Feed extends StatelessWidget {
    final String url;
    const Feed({Key key, this.url}) : super(key: key);
    @override
    Widget build(BuildContext context) {
    var entries = new FutureBuilder(
    future: fetchAtom(url),
    builder: (context, snapshot) {
    if (snapshot.hasData) {
    var feed = snapshot.data;
    return new Entries(feed: feed);
    } else if (snapshot.hasError) {
    return new Text("${snapshot.error}");
    }
    return new CircularProgressIndicator();
    });
    return new Scaffold(
    appBar: new AppBar(title: new Text("Feed")),
    body: entries,
    );
    }
    }

    View Slide

  18. w એݴతͳ6*ϑϨʔϜϫʔΫ͕ྲྀߦ
    w 3FBDU 'MVUUFS
    w ඇಉظॲཧΛѻ͍΍͘͢͢Δ࢓૊Έ
    w 3FBDUͷTVTQFOTF
    w 'MVUUFSͷ'VUVSF#VJMEFS
    w .BS[JQBO͸Ͳ͏ͳΔʁ

    View Slide

  19. .BS[JQBO
    w Ͳ͏͍͏΋ͷ͔
    w 6*,JUͷҠ২ʁ
    w ৽͍͠6*ϑϨʔϜϫʔΫʁ
    w 4XJGUͱͷ਌࿨ੑ͸
    w ͦ΋ͦ΋ൃද͞ΕΔͷ͔

    View Slide