├── .gitignore ├── Podfile ├── README.md ├── RWReactivePlayground.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcuserdata │ └── ceberhardt.xcuserdatad │ └── xcschemes │ ├── RWReactivePlayground.xcscheme │ └── xcschememanagement.plist ├── RWReactivePlayground.xcworkspace └── contents.xcworkspacedata ├── RWReactivePlayground ├── Base.lproj │ └── Main.storyboard ├── Images.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── LaunchImage.launchimage │ │ └── Contents.json ├── RWAppDelegate.h ├── RWAppDelegate.m ├── RWDummySignInService.h ├── RWDummySignInService.m ├── RWReactivePlayground-Info.plist ├── RWReactivePlayground-Prefix.pch ├── RWViewController.h ├── RWViewController.m ├── en.lproj │ └── InfoPlist.strings ├── kitten.jpg └── main.m └── ReactivePlaygroundStarter.jpg /.gitignore: -------------------------------------------------------------------------------- 1 | ######################### 2 | # .gitignore file for Xcode4 / OS X Source projects 3 | # 4 | # Version 2.0 5 | # For latest version, see: http://stackoverflow.com/questions/49478/git-ignore-file-for-xcode-projects 6 | # 7 | # 2013 updates: 8 | # - fixed the broken "save personal Schemes" 9 | # 10 | # NB: if you are storing "built" products, this WILL NOT WORK, 11 | # and you should use a different .gitignore (or none at all) 12 | # This file is for SOURCE projects, where there are many extra 13 | # files that we want to exclude 14 | # 15 | ######################### 16 | 17 | ##### 18 | # OS X temporary files that should never be committed 19 | 20 | .DS_Store 21 | *.swp 22 | *.lock 23 | profile 24 | 25 | 26 | #### 27 | # Xcode temporary files that should never be committed 28 | # 29 | # NB: NIB/XIB files still exist even on Storyboard projects, so we want this... 30 | 31 | *~.nib 32 | 33 | 34 | #### 35 | # Xcode build files - 36 | # 37 | # NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "DerivedData" 38 | 39 | DerivedData/ 40 | 41 | # NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "build" 42 | 43 | build/ 44 | 45 | 46 | ##### 47 | # Xcode private settings (window sizes, bookmarks, breakpoints, custom executables, smart groups) 48 | # 49 | # This is complicated: 50 | # 51 | # SOMETIMES you need to put this file in version control. 52 | # Apple designed it poorly - if you use "custom executables", they are 53 | # saved in this file. 54 | # 99% of projects do NOT use those, so they do NOT want to version control this file. 55 | # ..but if you're in the 1%, comment out the line "*.pbxuser" 56 | 57 | *.pbxuser 58 | *.mode1v3 59 | *.mode2v3 60 | *.perspectivev3 61 | # NB: also, whitelist the default ones, some projects need to use these 62 | !default.pbxuser 63 | !default.mode1v3 64 | !default.mode2v3 65 | !default.perspectivev3 66 | 67 | 68 | #### 69 | # Xcode 4 - semi-personal settings 70 | # 71 | # 72 | # OPTION 1: --------------------------------- 73 | # throw away ALL personal settings (including custom schemes! 74 | # - unless they are "shared") 75 | # 76 | # NB: this is exclusive with OPTION 2 below 77 | xcuserdata 78 | 79 | # OPTION 2: --------------------------------- 80 | # get rid of ALL personal settings, but KEEP SOME OF THEM 81 | # - NB: you must manually uncomment the bits you want to keep 82 | # 83 | # NB: this is exclusive with OPTION 1 above 84 | # 85 | #xcuserdata/**/* 86 | 87 | # (requires option 2 above): Personal Schemes 88 | # 89 | #!xcuserdata/**/xcschemes/* 90 | 91 | #### 92 | # XCode 4 workspaces - more detailed 93 | # 94 | # Workspaces are important! They are a core feature of Xcode - don't exclude them :) 95 | # 96 | # Workspace layout is quite spammy. For reference: 97 | # 98 | # /(root)/ 99 | # /(project-name).xcodeproj/ 100 | # project.pbxproj 101 | # /project.xcworkspace/ 102 | # contents.xcworkspacedata 103 | # /xcuserdata/ 104 | # /(your name)/xcuserdatad/ 105 | # UserInterfaceState.xcuserstate 106 | # /xcsshareddata/ 107 | # /xcschemes/ 108 | # (shared scheme name).xcscheme 109 | # /xcuserdata/ 110 | # /(your name)/xcuserdatad/ 111 | # (private scheme).xcscheme 112 | # xcschememanagement.plist 113 | # 114 | # 115 | 116 | #### 117 | # Xcode 4 - Deprecated classes 118 | # 119 | # Allegedly, if you manually "deprecate" your classes, they get moved here. 120 | # 121 | # We're using source-control, so this is a "feature" that we do not want! 122 | 123 | *.moved-aside 124 | 125 | #### 126 | # Cocoapods: cocoapods.org 127 | # 128 | # Ignoring these files means that whoever uses the code will first have to run: 129 | # pod install 130 | # in the App.xcodeproj directory. 131 | # This ensures the latest dependencies are used. 132 | Pods/ 133 | Podfile.lock 134 | 135 | 136 | #### 137 | # UNKNOWN: recommended by others, but I can't discover what these files are 138 | # 139 | # ...none. Everything is now explained. -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '7.0' 2 | 3 | pod 'ReactiveCocoa', '2.1.8' 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #Reactive Playground 2 | 3 | This project accompanies an article I wrote for [raywenderlich.com](http://www.raywendelich.com) on the subject of ReactiveCocoa. This project demonstrates how to introduce reactive concepts to a simple sign in screen. 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /RWReactivePlayground.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | archiveVersion 6 | 1 7 | classes 8 | 9 | objectVersion 10 | 46 11 | objects 12 | 13 | 08A3AF6F6456432C9561F244 14 | 15 | explicitFileType 16 | archive.ar 17 | includeInIndex 18 | 0 19 | isa 20 | PBXFileReference 21 | path 22 | libPods.a 23 | sourceTree 24 | BUILT_PRODUCTS_DIR 25 | 26 | 3BF9C92AA2B44B05B25FF647 27 | 28 | includeInIndex 29 | 1 30 | isa 31 | PBXFileReference 32 | lastKnownFileType 33 | text.xcconfig 34 | name 35 | Pods.xcconfig 36 | path 37 | Pods/Pods.xcconfig 38 | sourceTree 39 | <group> 40 | 41 | 721E122618698DC100B30134 42 | 43 | isa 44 | PBXFileReference 45 | lastKnownFileType 46 | image.jpeg 47 | path 48 | kitten.jpg 49 | sourceTree 50 | <group> 51 | 52 | 721E122718698DC100B30134 53 | 54 | fileRef 55 | 721E122618698DC100B30134 56 | isa 57 | PBXBuildFile 58 | 59 | 72A2881118618A2E00DDD30A 60 | 61 | children 62 | 63 | 72A2882318618A2E00DDD30A 64 | 72A2881C18618A2E00DDD30A 65 | 72A2881B18618A2E00DDD30A 66 | 3BF9C92AA2B44B05B25FF647 67 | 68 | isa 69 | PBXGroup 70 | sourceTree 71 | <group> 72 | 73 | 72A2881218618A2E00DDD30A 74 | 75 | attributes 76 | 77 | CLASSPREFIX 78 | RW 79 | LastUpgradeCheck 80 | 0500 81 | ORGANIZATIONNAME 82 | Colin Eberhardt 83 | TargetAttributes 84 | 85 | 72A2883A18618A2E00DDD30A 86 | 87 | TestTargetID 88 | 72A2881918618A2E00DDD30A 89 | 90 | 91 | 92 | buildConfigurationList 93 | 72A2881518618A2E00DDD30A 94 | compatibilityVersion 95 | Xcode 3.2 96 | developmentRegion 97 | English 98 | hasScannedForEncodings 99 | 0 100 | isa 101 | PBXProject 102 | knownRegions 103 | 104 | en 105 | Base 106 | 107 | mainGroup 108 | 72A2881118618A2E00DDD30A 109 | productRefGroup 110 | 72A2881B18618A2E00DDD30A 111 | projectDirPath 112 | 113 | projectReferences 114 | 115 | projectRoot 116 | 117 | targets 118 | 119 | 72A2881918618A2E00DDD30A 120 | 72A2883A18618A2E00DDD30A 121 | 122 | 123 | 72A2881518618A2E00DDD30A 124 | 125 | buildConfigurations 126 | 127 | 72A2884A18618A2E00DDD30A 128 | 72A2884B18618A2E00DDD30A 129 | 130 | defaultConfigurationIsVisible 131 | 0 132 | defaultConfigurationName 133 | Release 134 | isa 135 | XCConfigurationList 136 | 137 | 72A2881618618A2E00DDD30A 138 | 139 | buildActionMask 140 | 2147483647 141 | files 142 | 143 | 72A2882A18618A2E00DDD30A 144 | 72A2883418618A2E00DDD30A 145 | 72A2882E18618A2E00DDD30A 146 | 72A2885418620EA100DDD30A 147 | 148 | isa 149 | PBXSourcesBuildPhase 150 | runOnlyForDeploymentPostprocessing 151 | 0 152 | 153 | 72A2881718618A2E00DDD30A 154 | 155 | buildActionMask 156 | 2147483647 157 | files 158 | 159 | 72A2882018618A2E00DDD30A 160 | 72A2882218618A2E00DDD30A 161 | 72A2881E18618A2E00DDD30A 162 | 984FCCAD77574686877BDB16 163 | 164 | isa 165 | PBXFrameworksBuildPhase 166 | runOnlyForDeploymentPostprocessing 167 | 0 168 | 169 | 72A2881818618A2E00DDD30A 170 | 171 | buildActionMask 172 | 2147483647 173 | files 174 | 175 | 721E122718698DC100B30134 176 | 72A2883618618A2E00DDD30A 177 | 72A2882818618A2E00DDD30A 178 | 72A2883118618A2E00DDD30A 179 | 180 | isa 181 | PBXResourcesBuildPhase 182 | runOnlyForDeploymentPostprocessing 183 | 0 184 | 185 | 72A2881918618A2E00DDD30A 186 | 187 | buildConfigurationList 188 | 72A2884C18618A2E00DDD30A 189 | buildPhases 190 | 191 | F9535506389D4058AFB78394 192 | 72A2881618618A2E00DDD30A 193 | 72A2881718618A2E00DDD30A 194 | 72A2881818618A2E00DDD30A 195 | 790202DB2DB5410F96E90070 196 | 197 | buildRules 198 | 199 | dependencies 200 | 201 | isa 202 | PBXNativeTarget 203 | name 204 | RWReactivePlayground 205 | productName 206 | RWReactivePlayground 207 | productReference 208 | 72A2881A18618A2E00DDD30A 209 | productType 210 | com.apple.product-type.application 211 | 212 | 72A2881A18618A2E00DDD30A 213 | 214 | explicitFileType 215 | wrapper.application 216 | includeInIndex 217 | 0 218 | isa 219 | PBXFileReference 220 | path 221 | RWReactivePlayground.app 222 | sourceTree 223 | BUILT_PRODUCTS_DIR 224 | 225 | 72A2881B18618A2E00DDD30A 226 | 227 | children 228 | 229 | 72A2881A18618A2E00DDD30A 230 | 72A2883B18618A2E00DDD30A 231 | 232 | isa 233 | PBXGroup 234 | name 235 | Products 236 | sourceTree 237 | <group> 238 | 239 | 72A2881C18618A2E00DDD30A 240 | 241 | children 242 | 243 | 72A2881D18618A2E00DDD30A 244 | 72A2881F18618A2E00DDD30A 245 | 72A2882118618A2E00DDD30A 246 | 72A2883C18618A2E00DDD30A 247 | 08A3AF6F6456432C9561F244 248 | 249 | isa 250 | PBXGroup 251 | name 252 | Frameworks 253 | sourceTree 254 | <group> 255 | 256 | 72A2881D18618A2E00DDD30A 257 | 258 | isa 259 | PBXFileReference 260 | lastKnownFileType 261 | wrapper.framework 262 | name 263 | Foundation.framework 264 | path 265 | System/Library/Frameworks/Foundation.framework 266 | sourceTree 267 | SDKROOT 268 | 269 | 72A2881E18618A2E00DDD30A 270 | 271 | fileRef 272 | 72A2881D18618A2E00DDD30A 273 | isa 274 | PBXBuildFile 275 | 276 | 72A2881F18618A2E00DDD30A 277 | 278 | isa 279 | PBXFileReference 280 | lastKnownFileType 281 | wrapper.framework 282 | name 283 | CoreGraphics.framework 284 | path 285 | System/Library/Frameworks/CoreGraphics.framework 286 | sourceTree 287 | SDKROOT 288 | 289 | 72A2882018618A2E00DDD30A 290 | 291 | fileRef 292 | 72A2881F18618A2E00DDD30A 293 | isa 294 | PBXBuildFile 295 | 296 | 72A2882118618A2E00DDD30A 297 | 298 | isa 299 | PBXFileReference 300 | lastKnownFileType 301 | wrapper.framework 302 | name 303 | UIKit.framework 304 | path 305 | System/Library/Frameworks/UIKit.framework 306 | sourceTree 307 | SDKROOT 308 | 309 | 72A2882218618A2E00DDD30A 310 | 311 | fileRef 312 | 72A2882118618A2E00DDD30A 313 | isa 314 | PBXBuildFile 315 | 316 | 72A2882318618A2E00DDD30A 317 | 318 | children 319 | 320 | 721E122618698DC100B30134 321 | 72A2882C18618A2E00DDD30A 322 | 72A2882D18618A2E00DDD30A 323 | 72A2882F18618A2E00DDD30A 324 | 72A2883218618A2E00DDD30A 325 | 72A2883318618A2E00DDD30A 326 | 72A2883518618A2E00DDD30A 327 | 72A2882418618A2E00DDD30A 328 | 72A2885218620EA100DDD30A 329 | 72A2885318620EA100DDD30A 330 | 331 | isa 332 | PBXGroup 333 | path 334 | RWReactivePlayground 335 | sourceTree 336 | <group> 337 | 338 | 72A2882418618A2E00DDD30A 339 | 340 | children 341 | 342 | 72A2882518618A2E00DDD30A 343 | 72A2882618618A2E00DDD30A 344 | 72A2882918618A2E00DDD30A 345 | 72A2882B18618A2E00DDD30A 346 | 347 | isa 348 | PBXGroup 349 | name 350 | Supporting Files 351 | sourceTree 352 | <group> 353 | 354 | 72A2882518618A2E00DDD30A 355 | 356 | isa 357 | PBXFileReference 358 | lastKnownFileType 359 | text.plist.xml 360 | path 361 | RWReactivePlayground-Info.plist 362 | sourceTree 363 | <group> 364 | 365 | 72A2882618618A2E00DDD30A 366 | 367 | children 368 | 369 | 72A2882718618A2E00DDD30A 370 | 371 | isa 372 | PBXVariantGroup 373 | name 374 | InfoPlist.strings 375 | sourceTree 376 | <group> 377 | 378 | 72A2882718618A2E00DDD30A 379 | 380 | isa 381 | PBXFileReference 382 | lastKnownFileType 383 | text.plist.strings 384 | name 385 | en 386 | path 387 | en.lproj/InfoPlist.strings 388 | sourceTree 389 | <group> 390 | 391 | 72A2882818618A2E00DDD30A 392 | 393 | fileRef 394 | 72A2882618618A2E00DDD30A 395 | isa 396 | PBXBuildFile 397 | 398 | 72A2882918618A2E00DDD30A 399 | 400 | isa 401 | PBXFileReference 402 | lastKnownFileType 403 | sourcecode.c.objc 404 | path 405 | main.m 406 | sourceTree 407 | <group> 408 | 409 | 72A2882A18618A2E00DDD30A 410 | 411 | fileRef 412 | 72A2882918618A2E00DDD30A 413 | isa 414 | PBXBuildFile 415 | 416 | 72A2882B18618A2E00DDD30A 417 | 418 | isa 419 | PBXFileReference 420 | lastKnownFileType 421 | sourcecode.c.h 422 | path 423 | RWReactivePlayground-Prefix.pch 424 | sourceTree 425 | <group> 426 | 427 | 72A2882C18618A2E00DDD30A 428 | 429 | isa 430 | PBXFileReference 431 | lastKnownFileType 432 | sourcecode.c.h 433 | path 434 | RWAppDelegate.h 435 | sourceTree 436 | <group> 437 | 438 | 72A2882D18618A2E00DDD30A 439 | 440 | isa 441 | PBXFileReference 442 | lastKnownFileType 443 | sourcecode.c.objc 444 | path 445 | RWAppDelegate.m 446 | sourceTree 447 | <group> 448 | 449 | 72A2882E18618A2E00DDD30A 450 | 451 | fileRef 452 | 72A2882D18618A2E00DDD30A 453 | isa 454 | PBXBuildFile 455 | 456 | 72A2882F18618A2E00DDD30A 457 | 458 | children 459 | 460 | 72A2883018618A2E00DDD30A 461 | 462 | isa 463 | PBXVariantGroup 464 | name 465 | Main.storyboard 466 | sourceTree 467 | <group> 468 | 469 | 72A2883018618A2E00DDD30A 470 | 471 | isa 472 | PBXFileReference 473 | lastKnownFileType 474 | file.storyboard 475 | name 476 | Base 477 | path 478 | Base.lproj/Main.storyboard 479 | sourceTree 480 | <group> 481 | 482 | 72A2883118618A2E00DDD30A 483 | 484 | fileRef 485 | 72A2882F18618A2E00DDD30A 486 | isa 487 | PBXBuildFile 488 | 489 | 72A2883218618A2E00DDD30A 490 | 491 | isa 492 | PBXFileReference 493 | lastKnownFileType 494 | sourcecode.c.h 495 | path 496 | RWViewController.h 497 | sourceTree 498 | <group> 499 | 500 | 72A2883318618A2E00DDD30A 501 | 502 | isa 503 | PBXFileReference 504 | lastKnownFileType 505 | sourcecode.c.objc 506 | path 507 | RWViewController.m 508 | sourceTree 509 | <group> 510 | 511 | 72A2883418618A2E00DDD30A 512 | 513 | fileRef 514 | 72A2883318618A2E00DDD30A 515 | isa 516 | PBXBuildFile 517 | 518 | 72A2883518618A2E00DDD30A 519 | 520 | isa 521 | PBXFileReference 522 | lastKnownFileType 523 | folder.assetcatalog 524 | path 525 | Images.xcassets 526 | sourceTree 527 | <group> 528 | 529 | 72A2883618618A2E00DDD30A 530 | 531 | fileRef 532 | 72A2883518618A2E00DDD30A 533 | isa 534 | PBXBuildFile 535 | 536 | 72A2883718618A2E00DDD30A 537 | 538 | buildActionMask 539 | 2147483647 540 | files 541 | 542 | isa 543 | PBXSourcesBuildPhase 544 | runOnlyForDeploymentPostprocessing 545 | 0 546 | 547 | 72A2883818618A2E00DDD30A 548 | 549 | buildActionMask 550 | 2147483647 551 | files 552 | 553 | 72A2883D18618A2E00DDD30A 554 | 72A2883F18618A2E00DDD30A 555 | 72A2883E18618A2E00DDD30A 556 | 557 | isa 558 | PBXFrameworksBuildPhase 559 | runOnlyForDeploymentPostprocessing 560 | 0 561 | 562 | 72A2883918618A2E00DDD30A 563 | 564 | buildActionMask 565 | 2147483647 566 | files 567 | 568 | isa 569 | PBXResourcesBuildPhase 570 | runOnlyForDeploymentPostprocessing 571 | 0 572 | 573 | 72A2883A18618A2E00DDD30A 574 | 575 | buildConfigurationList 576 | 72A2884F18618A2E00DDD30A 577 | buildPhases 578 | 579 | 72A2883718618A2E00DDD30A 580 | 72A2883818618A2E00DDD30A 581 | 72A2883918618A2E00DDD30A 582 | 583 | buildRules 584 | 585 | dependencies 586 | 587 | 72A2884118618A2E00DDD30A 588 | 589 | isa 590 | PBXNativeTarget 591 | name 592 | RWReactivePlaygroundTests 593 | productName 594 | RWReactivePlaygroundTests 595 | productReference 596 | 72A2883B18618A2E00DDD30A 597 | productType 598 | com.apple.product-type.bundle.unit-test 599 | 600 | 72A2883B18618A2E00DDD30A 601 | 602 | explicitFileType 603 | wrapper.cfbundle 604 | includeInIndex 605 | 0 606 | isa 607 | PBXFileReference 608 | path 609 | RWReactivePlaygroundTests.xctest 610 | sourceTree 611 | BUILT_PRODUCTS_DIR 612 | 613 | 72A2883C18618A2E00DDD30A 614 | 615 | isa 616 | PBXFileReference 617 | lastKnownFileType 618 | wrapper.framework 619 | name 620 | XCTest.framework 621 | path 622 | Library/Frameworks/XCTest.framework 623 | sourceTree 624 | DEVELOPER_DIR 625 | 626 | 72A2883D18618A2E00DDD30A 627 | 628 | fileRef 629 | 72A2883C18618A2E00DDD30A 630 | isa 631 | PBXBuildFile 632 | 633 | 72A2883E18618A2E00DDD30A 634 | 635 | fileRef 636 | 72A2881D18618A2E00DDD30A 637 | isa 638 | PBXBuildFile 639 | 640 | 72A2883F18618A2E00DDD30A 641 | 642 | fileRef 643 | 72A2882118618A2E00DDD30A 644 | isa 645 | PBXBuildFile 646 | 647 | 72A2884018618A2E00DDD30A 648 | 649 | containerPortal 650 | 72A2881218618A2E00DDD30A 651 | isa 652 | PBXContainerItemProxy 653 | proxyType 654 | 1 655 | remoteGlobalIDString 656 | 72A2881918618A2E00DDD30A 657 | remoteInfo 658 | RWReactivePlayground 659 | 660 | 72A2884118618A2E00DDD30A 661 | 662 | isa 663 | PBXTargetDependency 664 | target 665 | 72A2881918618A2E00DDD30A 666 | targetProxy 667 | 72A2884018618A2E00DDD30A 668 | 669 | 72A2884A18618A2E00DDD30A 670 | 671 | buildSettings 672 | 673 | ALWAYS_SEARCH_USER_PATHS 674 | NO 675 | ARCHS 676 | $(ARCHS_STANDARD_INCLUDING_64_BIT) 677 | CLANG_CXX_LANGUAGE_STANDARD 678 | gnu++0x 679 | CLANG_CXX_LIBRARY 680 | libc++ 681 | CLANG_ENABLE_MODULES 682 | YES 683 | CLANG_ENABLE_OBJC_ARC 684 | YES 685 | CLANG_WARN_BOOL_CONVERSION 686 | YES 687 | CLANG_WARN_CONSTANT_CONVERSION 688 | YES 689 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE 690 | YES_ERROR 691 | CLANG_WARN_EMPTY_BODY 692 | YES 693 | CLANG_WARN_ENUM_CONVERSION 694 | YES 695 | CLANG_WARN_INT_CONVERSION 696 | YES 697 | CLANG_WARN_OBJC_ROOT_CLASS 698 | YES_ERROR 699 | CLANG_WARN__DUPLICATE_METHOD_MATCH 700 | YES 701 | CODE_SIGN_IDENTITY[sdk=iphoneos*] 702 | iPhone Developer 703 | COPY_PHASE_STRIP 704 | NO 705 | GCC_C_LANGUAGE_STANDARD 706 | gnu99 707 | GCC_DYNAMIC_NO_PIC 708 | NO 709 | GCC_OPTIMIZATION_LEVEL 710 | 0 711 | GCC_PREPROCESSOR_DEFINITIONS 712 | 713 | DEBUG=1 714 | $(inherited) 715 | 716 | GCC_SYMBOLS_PRIVATE_EXTERN 717 | NO 718 | GCC_WARN_64_TO_32_BIT_CONVERSION 719 | YES 720 | GCC_WARN_ABOUT_RETURN_TYPE 721 | YES_ERROR 722 | GCC_WARN_UNDECLARED_SELECTOR 723 | YES 724 | GCC_WARN_UNINITIALIZED_AUTOS 725 | YES 726 | GCC_WARN_UNUSED_FUNCTION 727 | YES 728 | GCC_WARN_UNUSED_VARIABLE 729 | YES 730 | IPHONEOS_DEPLOYMENT_TARGET 731 | 7.0 732 | ONLY_ACTIVE_ARCH 733 | YES 734 | SDKROOT 735 | iphoneos 736 | 737 | isa 738 | XCBuildConfiguration 739 | name 740 | Debug 741 | 742 | 72A2884B18618A2E00DDD30A 743 | 744 | buildSettings 745 | 746 | ALWAYS_SEARCH_USER_PATHS 747 | NO 748 | ARCHS 749 | $(ARCHS_STANDARD_INCLUDING_64_BIT) 750 | CLANG_CXX_LANGUAGE_STANDARD 751 | gnu++0x 752 | CLANG_CXX_LIBRARY 753 | libc++ 754 | CLANG_ENABLE_MODULES 755 | YES 756 | CLANG_ENABLE_OBJC_ARC 757 | YES 758 | CLANG_WARN_BOOL_CONVERSION 759 | YES 760 | CLANG_WARN_CONSTANT_CONVERSION 761 | YES 762 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE 763 | YES_ERROR 764 | CLANG_WARN_EMPTY_BODY 765 | YES 766 | CLANG_WARN_ENUM_CONVERSION 767 | YES 768 | CLANG_WARN_INT_CONVERSION 769 | YES 770 | CLANG_WARN_OBJC_ROOT_CLASS 771 | YES_ERROR 772 | CLANG_WARN__DUPLICATE_METHOD_MATCH 773 | YES 774 | CODE_SIGN_IDENTITY[sdk=iphoneos*] 775 | iPhone Developer 776 | COPY_PHASE_STRIP 777 | YES 778 | ENABLE_NS_ASSERTIONS 779 | NO 780 | GCC_C_LANGUAGE_STANDARD 781 | gnu99 782 | GCC_WARN_64_TO_32_BIT_CONVERSION 783 | YES 784 | GCC_WARN_ABOUT_RETURN_TYPE 785 | YES_ERROR 786 | GCC_WARN_UNDECLARED_SELECTOR 787 | YES 788 | GCC_WARN_UNINITIALIZED_AUTOS 789 | YES 790 | GCC_WARN_UNUSED_FUNCTION 791 | YES 792 | GCC_WARN_UNUSED_VARIABLE 793 | YES 794 | IPHONEOS_DEPLOYMENT_TARGET 795 | 7.0 796 | SDKROOT 797 | iphoneos 798 | VALIDATE_PRODUCT 799 | YES 800 | 801 | isa 802 | XCBuildConfiguration 803 | name 804 | Release 805 | 806 | 72A2884C18618A2E00DDD30A 807 | 808 | buildConfigurations 809 | 810 | 72A2884D18618A2E00DDD30A 811 | 72A2884E18618A2E00DDD30A 812 | 813 | defaultConfigurationIsVisible 814 | 0 815 | defaultConfigurationName 816 | Release 817 | isa 818 | XCConfigurationList 819 | 820 | 72A2884D18618A2E00DDD30A 821 | 822 | baseConfigurationReference 823 | 3BF9C92AA2B44B05B25FF647 824 | buildSettings 825 | 826 | ASSETCATALOG_COMPILER_APPICON_NAME 827 | AppIcon 828 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME 829 | LaunchImage 830 | GCC_PRECOMPILE_PREFIX_HEADER 831 | YES 832 | GCC_PREFIX_HEADER 833 | RWReactivePlayground/RWReactivePlayground-Prefix.pch 834 | INFOPLIST_FILE 835 | RWReactivePlayground/RWReactivePlayground-Info.plist 836 | PRODUCT_NAME 837 | $(TARGET_NAME) 838 | WRAPPER_EXTENSION 839 | app 840 | 841 | isa 842 | XCBuildConfiguration 843 | name 844 | Debug 845 | 846 | 72A2884E18618A2E00DDD30A 847 | 848 | baseConfigurationReference 849 | 3BF9C92AA2B44B05B25FF647 850 | buildSettings 851 | 852 | ASSETCATALOG_COMPILER_APPICON_NAME 853 | AppIcon 854 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME 855 | LaunchImage 856 | GCC_PRECOMPILE_PREFIX_HEADER 857 | YES 858 | GCC_PREFIX_HEADER 859 | RWReactivePlayground/RWReactivePlayground-Prefix.pch 860 | INFOPLIST_FILE 861 | RWReactivePlayground/RWReactivePlayground-Info.plist 862 | PRODUCT_NAME 863 | $(TARGET_NAME) 864 | WRAPPER_EXTENSION 865 | app 866 | 867 | isa 868 | XCBuildConfiguration 869 | name 870 | Release 871 | 872 | 72A2884F18618A2E00DDD30A 873 | 874 | buildConfigurations 875 | 876 | 72A2885018618A2E00DDD30A 877 | 72A2885118618A2E00DDD30A 878 | 879 | defaultConfigurationIsVisible 880 | 0 881 | defaultConfigurationName 882 | Release 883 | isa 884 | XCConfigurationList 885 | 886 | 72A2885018618A2E00DDD30A 887 | 888 | buildSettings 889 | 890 | ARCHS 891 | $(ARCHS_STANDARD_INCLUDING_64_BIT) 892 | BUNDLE_LOADER 893 | $(BUILT_PRODUCTS_DIR)/RWReactivePlayground.app/RWReactivePlayground 894 | FRAMEWORK_SEARCH_PATHS 895 | 896 | $(SDKROOT)/Developer/Library/Frameworks 897 | $(inherited) 898 | $(DEVELOPER_FRAMEWORKS_DIR) 899 | 900 | GCC_PRECOMPILE_PREFIX_HEADER 901 | YES 902 | GCC_PREFIX_HEADER 903 | RWReactivePlayground/RWReactivePlayground-Prefix.pch 904 | GCC_PREPROCESSOR_DEFINITIONS 905 | 906 | DEBUG=1 907 | $(inherited) 908 | 909 | INFOPLIST_FILE 910 | RWReactivePlaygroundTests/RWReactivePlaygroundTests-Info.plist 911 | PRODUCT_NAME 912 | $(TARGET_NAME) 913 | TEST_HOST 914 | $(BUNDLE_LOADER) 915 | WRAPPER_EXTENSION 916 | xctest 917 | 918 | isa 919 | XCBuildConfiguration 920 | name 921 | Debug 922 | 923 | 72A2885118618A2E00DDD30A 924 | 925 | buildSettings 926 | 927 | ARCHS 928 | $(ARCHS_STANDARD_INCLUDING_64_BIT) 929 | BUNDLE_LOADER 930 | $(BUILT_PRODUCTS_DIR)/RWReactivePlayground.app/RWReactivePlayground 931 | FRAMEWORK_SEARCH_PATHS 932 | 933 | $(SDKROOT)/Developer/Library/Frameworks 934 | $(inherited) 935 | $(DEVELOPER_FRAMEWORKS_DIR) 936 | 937 | GCC_PRECOMPILE_PREFIX_HEADER 938 | YES 939 | GCC_PREFIX_HEADER 940 | RWReactivePlayground/RWReactivePlayground-Prefix.pch 941 | INFOPLIST_FILE 942 | RWReactivePlaygroundTests/RWReactivePlaygroundTests-Info.plist 943 | PRODUCT_NAME 944 | $(TARGET_NAME) 945 | TEST_HOST 946 | $(BUNDLE_LOADER) 947 | WRAPPER_EXTENSION 948 | xctest 949 | 950 | isa 951 | XCBuildConfiguration 952 | name 953 | Release 954 | 955 | 72A2885218620EA100DDD30A 956 | 957 | fileEncoding 958 | 4 959 | isa 960 | PBXFileReference 961 | lastKnownFileType 962 | sourcecode.c.h 963 | path 964 | RWDummySignInService.h 965 | sourceTree 966 | <group> 967 | 968 | 72A2885318620EA100DDD30A 969 | 970 | fileEncoding 971 | 4 972 | isa 973 | PBXFileReference 974 | lastKnownFileType 975 | sourcecode.c.objc 976 | path 977 | RWDummySignInService.m 978 | sourceTree 979 | <group> 980 | 981 | 72A2885418620EA100DDD30A 982 | 983 | fileRef 984 | 72A2885318620EA100DDD30A 985 | isa 986 | PBXBuildFile 987 | 988 | 790202DB2DB5410F96E90070 989 | 990 | buildActionMask 991 | 2147483647 992 | files 993 | 994 | inputPaths 995 | 996 | isa 997 | PBXShellScriptBuildPhase 998 | name 999 | Copy Pods Resources 1000 | outputPaths 1001 | 1002 | runOnlyForDeploymentPostprocessing 1003 | 0 1004 | shellPath 1005 | /bin/sh 1006 | shellScript 1007 | "${SRCROOT}/Pods/Pods-resources.sh" 1008 | 1009 | showEnvVarsInLog 1010 | 0 1011 | 1012 | 984FCCAD77574686877BDB16 1013 | 1014 | fileRef 1015 | 08A3AF6F6456432C9561F244 1016 | isa 1017 | PBXBuildFile 1018 | 1019 | F9535506389D4058AFB78394 1020 | 1021 | buildActionMask 1022 | 2147483647 1023 | files 1024 | 1025 | inputPaths 1026 | 1027 | isa 1028 | PBXShellScriptBuildPhase 1029 | name 1030 | Check Pods Manifest.lock 1031 | outputPaths 1032 | 1033 | runOnlyForDeploymentPostprocessing 1034 | 0 1035 | shellPath 1036 | /bin/sh 1037 | shellScript 1038 | diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null 1039 | if [[ $? != 0 ]] ; then 1040 | cat << EOM 1041 | error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation. 1042 | EOM 1043 | exit 1 1044 | fi 1045 | 1046 | showEnvVarsInLog 1047 | 0 1048 | 1049 | 1050 | rootObject 1051 | 72A2881218618A2E00DDD30A 1052 | 1053 | 1054 | -------------------------------------------------------------------------------- /RWReactivePlayground.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /RWReactivePlayground.xcodeproj/xcuserdata/ceberhardt.xcuserdatad/xcschemes/RWReactivePlayground.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 61 | 62 | 68 | 69 | 70 | 71 | 72 | 73 | 79 | 80 | 86 | 87 | 88 | 89 | 91 | 92 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /RWReactivePlayground.xcodeproj/xcuserdata/ceberhardt.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | RWReactivePlayground.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 72A2881918618A2E00DDD30A 16 | 17 | primary 18 | 19 | 20 | 72A2883A18618A2E00DDD30A 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /RWReactivePlayground.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /RWReactivePlayground/Base.lproj/Main.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 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 53 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | -------------------------------------------------------------------------------- /RWReactivePlayground/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "40x40", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "60x60", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /RWReactivePlayground/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "orientation" : "portrait", 12 | "idiom" : "iphone", 13 | "subtype" : "retina4", 14 | "extent" : "full-screen", 15 | "minimum-system-version" : "7.0", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /RWReactivePlayground/RWAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // RWAppDelegate.h 3 | // RWReactivePlayground 4 | // 5 | // Created by Colin Eberhardt on 18/12/2013. 6 | // Copyright (c) 2013 Colin Eberhardt. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface RWAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /RWReactivePlayground/RWAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // RWAppDelegate.m 3 | // RWReactivePlayground 4 | // 5 | // Created by Colin Eberhardt on 18/12/2013. 6 | // Copyright (c) 2013 Colin Eberhardt. All rights reserved. 7 | // 8 | 9 | #import "RWAppDelegate.h" 10 | 11 | @implementation RWAppDelegate 12 | 13 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 14 | { 15 | // style the navigation bar 16 | UIColor* navColor = [UIColor colorWithRed:0.175f green:0.458f blue:0.831f alpha:1.0f]; 17 | [[UINavigationBar appearance] setBarTintColor:navColor]; 18 | [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]]; 19 | [[UINavigationBar appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor]}]; 20 | 21 | // make the status bar white 22 | [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent; 23 | 24 | 25 | return YES; 26 | } 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /RWReactivePlayground/RWDummySignInService.h: -------------------------------------------------------------------------------- 1 | // 2 | // RWDummySignInService.h 3 | // RWReactivePlayground 4 | // 5 | // Created by Colin Eberhardt on 18/12/2013. 6 | // Copyright (c) 2013 Colin Eberhardt. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef void (^RWSignInResponse)(BOOL); 12 | 13 | @interface RWDummySignInService : NSObject 14 | 15 | - (void)signInWithUsername:(NSString *)username password:(NSString *)password complete:(RWSignInResponse)completeBlock; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /RWReactivePlayground/RWDummySignInService.m: -------------------------------------------------------------------------------- 1 | // 2 | // RWDummySignInService.m 3 | // RWReactivePlayground 4 | // 5 | // Created by Colin Eberhardt on 18/12/2013. 6 | // Copyright (c) 2013 Colin Eberhardt. All rights reserved. 7 | // 8 | 9 | #import "RWDummySignInService.h" 10 | 11 | @implementation RWDummySignInService 12 | 13 | 14 | - (void)signInWithUsername:(NSString *)username password:(NSString *)password complete:(RWSignInResponse)completeBlock { 15 | 16 | [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; 17 | double delayInSeconds = 2.0; 18 | dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 19 | dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 20 | [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; 21 | BOOL success = [username isEqualToString:@"user"] && [password isEqualToString:@"password"]; 22 | completeBlock(success); 23 | }); 24 | } 25 | 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /RWReactivePlayground/RWReactivePlayground-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | com.razeware.${PRODUCT_NAME:rfc1034identifier} 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.0 25 | LSRequiresIPhoneOS 26 | 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /RWReactivePlayground/RWReactivePlayground-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #import 8 | 9 | #ifndef __IPHONE_5_0 10 | #warning "This project uses features only available in iOS SDK 5.0 and later." 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | #import 15 | #import 16 | #endif 17 | -------------------------------------------------------------------------------- /RWReactivePlayground/RWViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // RWViewController.h 3 | // RWReactivePlayground 4 | // 5 | // Created by Colin Eberhardt on 18/12/2013. 6 | // Copyright (c) 2013 Colin Eberhardt. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface RWViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /RWReactivePlayground/RWViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // RWViewController.m 3 | // RWReactivePlayground 4 | // 5 | // Created by Colin Eberhardt on 18/12/2013. 6 | // Copyright (c) 2013 Colin Eberhardt. All rights reserved. 7 | // 8 | 9 | #import "RWViewController.h" 10 | #import "RWDummySignInService.h" 11 | #import 12 | 13 | @interface RWViewController () 14 | 15 | @property (weak, nonatomic) IBOutlet UITextField *usernameTextField; 16 | @property (weak, nonatomic) IBOutlet UITextField *passwordTextField; 17 | @property (weak, nonatomic) IBOutlet UIButton *signInButton; 18 | @property (weak, nonatomic) IBOutlet UILabel *signInFailureText; 19 | 20 | @property (strong, nonatomic) RWDummySignInService *signInService; 21 | 22 | @end 23 | 24 | @implementation RWViewController 25 | 26 | - (void)viewDidLoad { 27 | [super viewDidLoad]; 28 | 29 | self.signInService = [RWDummySignInService new]; 30 | 31 | // initially hide the failure message 32 | self.signInFailureText.hidden = YES; 33 | 34 | 35 | RACSignal *validUsernameSignal = 36 | [self.usernameTextField.rac_textSignal 37 | map:^id(NSString *text) { 38 | return @([self isValidUsername:text]); 39 | }]; 40 | 41 | RACSignal *validPasswordSignal = 42 | [self.passwordTextField.rac_textSignal 43 | map:^id(NSString *text) { 44 | return @([self isValidPassword:text]); 45 | }]; 46 | 47 | RAC(self.passwordTextField, backgroundColor) = 48 | [validPasswordSignal 49 | map:^id(NSNumber *passwordValid) { 50 | return [passwordValid boolValue] ? [UIColor clearColor] : [UIColor yellowColor]; 51 | }]; 52 | 53 | RAC(self.usernameTextField, backgroundColor) = 54 | [validUsernameSignal 55 | map:^id(NSNumber *passwordValid) { 56 | return [passwordValid boolValue] ? [UIColor clearColor] : [UIColor yellowColor]; 57 | }]; 58 | 59 | 60 | RACSignal *signUpActiveSignal = 61 | [RACSignal combineLatest:@[validUsernameSignal, validPasswordSignal] 62 | reduce:^id(NSNumber *usernameValid, NSNumber *passwordValid) { 63 | return @([usernameValid boolValue] && [passwordValid boolValue]); 64 | }]; 65 | 66 | [signUpActiveSignal subscribeNext:^(NSNumber *signupActive) { 67 | self.signInButton.enabled = [signupActive boolValue]; 68 | }]; 69 | 70 | [[[[self.signInButton 71 | rac_signalForControlEvents:UIControlEventTouchUpInside] 72 | doNext:^(id x) { 73 | self.signInButton.enabled = NO; 74 | self.signInFailureText.hidden = YES; 75 | }] 76 | flattenMap:^id(id x) { 77 | return [self signInSignal]; 78 | }] 79 | subscribeNext:^(NSNumber *signedIn) { 80 | self.signInButton.enabled = YES; 81 | BOOL success = [signedIn boolValue]; 82 | self.signInFailureText.hidden = success; 83 | if (success) { 84 | [self performSegueWithIdentifier:@"signInSuccess" sender:self]; 85 | } 86 | }]; 87 | } 88 | 89 | - (BOOL)isValidUsername:(NSString *)username { 90 | return username.length > 3; 91 | } 92 | 93 | - (BOOL)isValidPassword:(NSString *)password { 94 | return password.length > 3; 95 | } 96 | 97 | -(RACSignal *)signInSignal { 98 | return [RACSignal createSignal:^RACDisposable *(id subscriber) { 99 | [self.signInService 100 | signInWithUsername:self.usernameTextField.text 101 | password:self.passwordTextField.text 102 | complete:^(BOOL success) { 103 | [subscriber sendNext:@(success)]; 104 | [subscriber sendCompleted]; 105 | }]; 106 | return nil; 107 | }]; 108 | } 109 | 110 | 111 | @end 112 | -------------------------------------------------------------------------------- /RWReactivePlayground/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /RWReactivePlayground/kitten.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColinEberhardt/RWReactivePlayground/dbd9296d38c3edbad9ae357c6af7f156edbd45a2/RWReactivePlayground/kitten.jpg -------------------------------------------------------------------------------- /RWReactivePlayground/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // RWReactivePlayground 4 | // 5 | // Created by Colin Eberhardt on 18/12/2013. 6 | // Copyright (c) 2013 Colin Eberhardt. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "RWAppDelegate.h" 12 | 13 | int main(int argc, char * argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([RWAppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /ReactivePlaygroundStarter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColinEberhardt/RWReactivePlayground/dbd9296d38c3edbad9ae357c6af7f156edbd45a2/ReactivePlaygroundStarter.jpg --------------------------------------------------------------------------------