Ecoer Logo
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS91.74%
Net Worth
0.148USD
STEEM
0.000STEEM
SBD
0.231SBD
Effective Power
5.008SP
├── Own SP
0.632SP
└── Incoming Deleg
+4.376SP

Detailed Balance

STEEM
balance
0.000STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
0.632SP
Delegated Out
0.000SP
Delegation In
4.376SP
Effective Power
5.008SP
Reward SP (pending)
0.252SP
SBD
sbd_balance
0.000SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.231SBD
{
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "0.000 STEEM",
  "vesting_shares": "1027.251799 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7116.408007 VESTS",
  "sbd_balance": "0.000 SBD",
  "savings_sbd_balance": "0.000 SBD",
  "reward_sbd_balance": "0.231 SBD",
  "conversions": []
}

Account Info

namesebastianboldt
id437237
rank829,691
reputation4544554905
created2017-11-10T15:26:21
recovery_accountsteem
proxyNone
post_count2
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2017-11-10T17:55:39
last_root_post2017-11-10T17:55:39
last_vote_time2017-11-10T19:44:33
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.000 STEEM
savings_balance0.000 STEEM
sbd_balance0.000 SBD
savings_sbd_balance0.000 SBD
vesting_shares1027.251799 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares7116.408007 VESTS
reward_vesting_balance517.548458 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update2017-11-10T17:37:42
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "id": 437237,
  "name": "sebastianboldt",
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8afWTATLFUHYxu1fDH2kQ9J1puGFoz7o2N12cELJjtZ4FrS6pg",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7kARdw8TFz3Wd9yxoTHxWb4iCM9fLq4o89hy5UwJJexo5MHqdx",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8Y45UonpGBJSoQANxeZWhokGZ9qM7M3vcoPsVpXTpQD2Hx7cUj",
        1
      ]
    ]
  },
  "memo_key": "STM7AiKN6QHNhmcJtVNoeyDi766EEYUZKGmn1nhZeaiGVSioZkrFt",
  "json_metadata": "{\"profile\":{\"profile_image\":\"https://i1.sndcdn.com/avatars-000341171874-uorr00-t500x500.jpg\",\"website\":\"http://sebastianboldt.com\"}}",
  "posting_json_metadata": "{\"profile\":{\"profile_image\":\"https://i1.sndcdn.com/avatars-000341171874-uorr00-t500x500.jpg\",\"website\":\"http://sebastianboldt.com\"}}",
  "proxy": "",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_account_update": "2017-11-10T17:37:42",
  "created": "2017-11-10T15:26:21",
  "mined": false,
  "recovery_account": "steem",
  "last_account_recovery": "1970-01-01T00:00:00",
  "reset_account": "null",
  "comment_count": 0,
  "lifetime_vote_count": 0,
  "post_count": 2,
  "can_vote": true,
  "voting_manabar": {
    "current_mana": "8143659806",
    "last_update_time": 1779084984
  },
  "downvote_manabar": {
    "current_mana": 2035914951,
    "last_update_time": 1779084984
  },
  "voting_power": 0,
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "sbd_balance": "0.000 SBD",
  "sbd_seconds": "0",
  "sbd_seconds_last_update": "1970-01-01T00:00:00",
  "sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "reward_sbd_balance": "0.231 SBD",
  "reward_steem_balance": "0.000 STEEM",
  "reward_vesting_balance": "517.548458 VESTS",
  "reward_vesting_steem": "0.252 STEEM",
  "vesting_shares": "1027.251799 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7116.408007 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "withdrawn": 0,
  "to_withdraw": 0,
  "withdraw_routes": 0,
  "curation_rewards": 4,
  "posting_rewards": 496,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "witnesses_voted_for": 0,
  "last_post": "2017-11-10T17:55:39",
  "last_root_post": "2017-11-10T17:55:39",
  "last_vote_time": "2017-11-10T19:44:33",
  "post_bandwidth": 0,
  "pending_claimed_accounts": 0,
  "vesting_balance": "0.000 STEEM",
  "reputation": "4544554905",
  "transfer_history": [],
  "market_history": [],
  "post_history": [],
  "vote_history": [],
  "other_history": [],
  "witness_votes": [],
  "tags_usage": [],
  "guest_bloggers": [],
  "rank": 829691
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 4.376 SP to @sebastianboldt
2026/05/18 06:16:24
delegatorsteem
delegateesebastianboldt
vesting shares7116.408007 VESTS
Transaction InfoBlock #106150641/Trx 4a54596203e5e59e8c8831d8df60d7a4173c3aeb
View Raw JSON Data
{
  "trx_id": "4a54596203e5e59e8c8831d8df60d7a4173c3aeb",
  "block": 106150641,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-18T06:16:24",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "7116.408007 VESTS"
    }
  ]
}
steemdelegated 2.708 SP to @sebastianboldt
2026/05/13 04:20:06
delegatorsteem
delegateesebastianboldt
vesting shares4404.197602 VESTS
Transaction InfoBlock #106005037/Trx 3020b8e5015b5090dfc3fbb09ff6115425d05ac4
View Raw JSON Data
{
  "trx_id": "3020b8e5015b5090dfc3fbb09ff6115425d05ac4",
  "block": 106005037,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-13T04:20:06",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "4404.197602 VESTS"
    }
  ]
}
steemdelegated 4.384 SP to @sebastianboldt
2026/04/26 05:28:09
delegatorsteem
delegateesebastianboldt
vesting shares7128.923763 VESTS
Transaction InfoBlock #105518124/Trx 960febe7ac2c39c05b66a0ad1188e085571c6b98
View Raw JSON Data
{
  "trx_id": "960febe7ac2c39c05b66a0ad1188e085571c6b98",
  "block": 105518124,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-04-26T05:28:09",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "7128.923763 VESTS"
    }
  ]
}
steemdelegated 2.734 SP to @sebastianboldt
2026/01/24 00:01:09
delegatorsteem
delegateesebastianboldt
vesting shares4445.744421 VESTS
Transaction InfoBlock #102871238/Trx 43bc204000d9009447091681a9caf6b65decd669
View Raw JSON Data
{
  "trx_id": "43bc204000d9009447091681a9caf6b65decd669",
  "block": 102871238,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-01-24T00:01:09",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "4445.744421 VESTS"
    }
  ]
}
steemdelegated 2.835 SP to @sebastianboldt
2024/12/17 19:10:57
delegatorsteem
delegateesebastianboldt
vesting shares4609.963618 VESTS
Transaction InfoBlock #91317448/Trx 8e400a1df9d5f0295cf7fcc22b75827192001da5
View Raw JSON Data
{
  "trx_id": "8e400a1df9d5f0295cf7fcc22b75827192001da5",
  "block": 91317448,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-12-17T19:10:57",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "4609.963618 VESTS"
    }
  ]
}
steemdelegated 2.939 SP to @sebastianboldt
2023/11/14 10:52:15
delegatorsteem
delegateesebastianboldt
vesting shares4779.097150 VESTS
Transaction InfoBlock #79871600/Trx d19766ee08892909e722b1d0a8af79b6fa45399f
View Raw JSON Data
{
  "trx_id": "d19766ee08892909e722b1d0a8af79b6fa45399f",
  "block": 79871600,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-11-14T10:52:15",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "4779.097150 VESTS"
    }
  ]
}
steemdelegated 4.745 SP to @sebastianboldt
2023/09/22 10:23:06
delegatorsteem
delegateesebastianboldt
vesting shares7716.005936 VESTS
Transaction InfoBlock #78362857/Trx 10035e71eeb441a27921e276c6798d8d042d3dd3
View Raw JSON Data
{
  "trx_id": "10035e71eeb441a27921e276c6798d8d042d3dd3",
  "block": 78362857,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-09-22T10:23:06",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "7716.005936 VESTS"
    }
  ]
}
steemdelegated 4.881 SP to @sebastianboldt
2022/11/03 17:50:30
delegatorsteem
delegateesebastianboldt
vesting shares7938.057374 VESTS
Transaction InfoBlock #69120593/Trx 5135f1fffcb346608cbc832f1be5a668133566fc
View Raw JSON Data
{
  "trx_id": "5135f1fffcb346608cbc832f1be5a668133566fc",
  "block": 69120593,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-11-03T17:50:30",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "7938.057374 VESTS"
    }
  ]
}
steemdelegated 5.017 SP to @sebastianboldt
2022/01/17 23:02:09
delegatorsteem
delegateesebastianboldt
vesting shares8158.164975 VESTS
Transaction InfoBlock #60823836/Trx c1542848dec387a165d21433c3f67758d3bacfe6
View Raw JSON Data
{
  "trx_id": "c1542848dec387a165d21433c3f67758d3bacfe6",
  "block": 60823836,
  "trx_in_block": 15,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-01-17T23:02:09",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "8158.164975 VESTS"
    }
  ]
}
steemdelegated 5.130 SP to @sebastianboldt
2021/06/14 06:13:15
delegatorsteem
delegateesebastianboldt
vesting shares8342.359263 VESTS
Transaction InfoBlock #54614163/Trx ae811bb83890a3caf9fa683cf30f6d82f863f2c4
View Raw JSON Data
{
  "trx_id": "ae811bb83890a3caf9fa683cf30f6d82f863f2c4",
  "block": 54614163,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2021-06-14T06:13:15",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "8342.359263 VESTS"
    }
  ]
}
steemdelegated 5.245 SP to @sebastianboldt
2020/12/11 16:25:36
delegatorsteem
delegateesebastianboldt
vesting shares8529.781237 VESTS
Transaction InfoBlock #49361431/Trx 7488bdde125a3e57a0aeb5a6dc0dfc2d087e89f8
View Raw JSON Data
{
  "trx_id": "7488bdde125a3e57a0aeb5a6dc0dfc2d087e89f8",
  "block": 49361431,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-11T16:25:36",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "8529.781237 VESTS"
    }
  ]
}
steemdelegated 1.176 SP to @sebastianboldt
2020/12/06 10:01:18
delegatorsteem
delegateesebastianboldt
vesting shares1912.543513 VESTS
Transaction InfoBlock #49212952/Trx ebd5b047d91140ca08facb14b14fc1a0b9870031
View Raw JSON Data
{
  "trx_id": "ebd5b047d91140ca08facb14b14fc1a0b9870031",
  "block": 49212952,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-06T10:01:18",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "1912.543513 VESTS"
    }
  ]
}
steemdelegated 5.249 SP to @sebastianboldt
2020/12/05 20:03:24
delegatorsteem
delegateesebastianboldt
vesting shares8535.989091 VESTS
Transaction InfoBlock #49196514/Trx 28883aef27f3a514a72a661d20d44f978d9529f2
View Raw JSON Data
{
  "trx_id": "28883aef27f3a514a72a661d20d44f978d9529f2",
  "block": 49196514,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-05T20:03:24",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "8535.989091 VESTS"
    }
  ]
}
steemdelegated 1.181 SP to @sebastianboldt
2020/11/03 02:37:54
delegatorsteem
delegateesebastianboldt
vesting shares1920.017158 VESTS
Transaction InfoBlock #48270746/Trx 516c97d6ef0dbb5810fb672b8240f6b3d3896084
View Raw JSON Data
{
  "trx_id": "516c97d6ef0dbb5810fb672b8240f6b3d3896084",
  "block": 48270746,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-11-03T02:37:54",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "1920.017158 VESTS"
    }
  ]
}
steemdelegated 5.374 SP to @sebastianboldt
2020/05/09 11:04:18
delegatorsteem
delegateesebastianboldt
vesting shares8738.794450 VESTS
Transaction InfoBlock #43223279/Trx da8bc76e93424298b9c7984b4d222f6b7974f77b
View Raw JSON Data
{
  "trx_id": "da8bc76e93424298b9c7984b4d222f6b7974f77b",
  "block": 43223279,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-09T11:04:18",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "8738.794450 VESTS"
    }
  ]
}
steemdelegated 1.201 SP to @sebastianboldt
2020/05/08 15:28:24
delegatorsteem
delegateesebastianboldt
vesting shares1953.311140 VESTS
Transaction InfoBlock #43200320/Trx 97a28521522adab83dd6634b42641702b795ec15
View Raw JSON Data
{
  "trx_id": "97a28521522adab83dd6634b42641702b795ec15",
  "block": 43200320,
  "trx_in_block": 10,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-08T15:28:24",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "1953.311140 VESTS"
    }
  ]
}
steemdelegated 5.382 SP to @sebastianboldt
2020/04/16 03:16:00
delegatorsteem
delegateesebastianboldt
vesting shares8751.681898 VESTS
Transaction InfoBlock #42569121/Trx 8076fbc734ad01ffc5fadcc6642f42b6adb1af45
View Raw JSON Data
{
  "trx_id": "8076fbc734ad01ffc5fadcc6642f42b6adb1af45",
  "block": 42569121,
  "trx_in_block": 13,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-04-16T03:16:00",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "8751.681898 VESTS"
    }
  ]
}
2019/11/10 16:32:33
parent authorsebastianboldt
parent permlink7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
authorsteemitboard
permlinksteemitboard-notify-sebastianboldt-20191110t163232000z
title
bodyCongratulations @sebastianboldt! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@sebastianboldt/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@sebastianboldt) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=sebastianboldt)_</sub> **Do not miss the last post from @steemitboard:** <table><tr><td><a href="https://steemit.com/steemfest/@steemitboard/steemfest-meet-the-stemians-contest-the-mysterious-rule-revealed"><img src="https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmasWw4jQHwxng82DKxY6Q6tVg9mWcto4xcDURs8knFgCa/image.png"></a></td><td><a href="https://steemit.com/steemfest/@steemitboard/steemfest-meet-the-stemians-contest-the-mysterious-rule-revealed">SteemFest Meet The Stemians Contest - The mysterious rule revealed</a></td></tr></table> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
Transaction InfoBlock #38057326/Trx 4c070e35a56f45a921f2870cb2777fd24a77fc2d
View Raw JSON Data
{
  "trx_id": "4c070e35a56f45a921f2870cb2777fd24a77fc2d",
  "block": 38057326,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-11-10T16:32:33",
  "op": [
    "comment",
    {
      "parent_author": "sebastianboldt",
      "parent_permlink": "7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-sebastianboldt-20191110t163232000z",
      "title": "",
      "body": "Congratulations @sebastianboldt! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@sebastianboldt/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@sebastianboldt) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=sebastianboldt)_</sub>\n\n\n**Do not miss the last post from @steemitboard:**\n<table><tr><td><a href=\"https://steemit.com/steemfest/@steemitboard/steemfest-meet-the-stemians-contest-the-mysterious-rule-revealed\"><img src=\"https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmasWw4jQHwxng82DKxY6Q6tVg9mWcto4xcDURs8knFgCa/image.png\"></a></td><td><a href=\"https://steemit.com/steemfest/@steemitboard/steemfest-meet-the-stemians-contest-the-mysterious-rule-revealed\">SteemFest Meet The Stemians Contest - The mysterious rule revealed</a></td></tr></table>\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
    }
  ]
}
steemdelegated 5.502 SP to @sebastianboldt
2019/05/12 20:23:06
delegatorsteem
delegateesebastianboldt
vesting shares8947.298711 VESTS
Transaction InfoBlock #32852063/Trx 8887c40de734231ecbcbd247b246b0c4bc99112d
View Raw JSON Data
{
  "trx_id": "8887c40de734231ecbcbd247b246b0c4bc99112d",
  "block": 32852063,
  "trx_in_block": 34,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-05-12T20:23:06",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "8947.298711 VESTS"
    }
  ]
}
2018/11/10 17:02:03
parent authorsebastianboldt
parent permlink7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
authorsteemitboard
permlinksteemitboard-notify-sebastianboldt-20181110t170203000z
title
bodyCongratulations @sebastianboldt! You have received a personal award! [![](https://steemitimages.com/70x70/http://steemitboard.com/@sebastianboldt/birthday1.png)](http://steemitboard.com/@sebastianboldt) 1 Year on Steemit <sub>_Click on the badge to view your Board of Honor._</sub> **Do not miss the last post from @steemitboard:** <table><tr><td><a href="https://steemit.com/steemfest/@steemitboard/steemfest3-and-steemitboard-meet-the-steemians-contest"><img src="https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmeLukvNFRsa7RURqsFpiLGEZZD49MiU52JtWmjS5S2wtW/image.png"></a></td><td><a href="https://steemit.com/steemfest/@steemitboard/steemfest3-and-steemitboard-meet-the-steemians-contest">SteemFest3 and SteemitBoard - Meet the Steemians Contest</a></td></tr></table> > Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
Transaction InfoBlock #27582859/Trx 30ff30594f6e02b9cf092cb2b68f2771e5c298cb
View Raw JSON Data
{
  "trx_id": "30ff30594f6e02b9cf092cb2b68f2771e5c298cb",
  "block": 27582859,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-11-10T17:02:03",
  "op": [
    "comment",
    {
      "parent_author": "sebastianboldt",
      "parent_permlink": "7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-sebastianboldt-20181110t170203000z",
      "title": "",
      "body": "Congratulations @sebastianboldt! You have received a personal award!\n\n[![](https://steemitimages.com/70x70/http://steemitboard.com/@sebastianboldt/birthday1.png)](http://steemitboard.com/@sebastianboldt)  1 Year on Steemit\n<sub>_Click on the badge to view your Board of Honor._</sub>\n\n\n**Do not miss the last post from @steemitboard:**\n<table><tr><td><a href=\"https://steemit.com/steemfest/@steemitboard/steemfest3-and-steemitboard-meet-the-steemians-contest\"><img src=\"https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmeLukvNFRsa7RURqsFpiLGEZZD49MiU52JtWmjS5S2wtW/image.png\"></a></td><td><a href=\"https://steemit.com/steemfest/@steemitboard/steemfest3-and-steemitboard-meet-the-steemians-contest\">SteemFest3 and SteemitBoard - Meet the Steemians Contest</a></td></tr></table>\n\n> Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
    }
  ]
}
steemdelegated 5.625 SP to @sebastianboldt
2018/05/17 02:41:42
delegatorsteem
delegateesebastianboldt
vesting shares9146.813803 VESTS
Transaction InfoBlock #22497534/Trx b18d749c3338eb8322dbc583b5d0728272a12020
View Raw JSON Data
{
  "trx_id": "b18d749c3338eb8322dbc583b5d0728272a12020",
  "block": 22497534,
  "trx_in_block": 46,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-17T02:41:42",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "9146.813803 VESTS"
    }
  ]
}
steemdelegated 18.162 SP to @sebastianboldt
2018/04/21 20:52:15
delegatorsteem
delegateesebastianboldt
vesting shares29534.916149 VESTS
Transaction InfoBlock #21771333/Trx d01c18f66e608d795319bcf279a3b0bc59464408
View Raw JSON Data
{
  "trx_id": "d01c18f66e608d795319bcf279a3b0bc59464408",
  "block": 21771333,
  "trx_in_block": 48,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-21T20:52:15",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "29534.916149 VESTS"
    }
  ]
}
steemdelegated 18.287 SP to @sebastianboldt
2017/12/12 22:22:12
delegatorsteem
delegateesebastianboldt
vesting shares29738.748201 VESTS
Transaction InfoBlock #18032627/Trx 4fbc1d3a0848aafbf4c05feede64743d539b0d63
View Raw JSON Data
{
  "trx_id": "4fbc1d3a0848aafbf4c05feede64743d539b0d63",
  "block": 18032627,
  "trx_in_block": 16,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-12-12T22:22:12",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "sebastianboldt",
      "vesting_shares": "29738.748201 VESTS"
    }
  ]
}
2017/11/27 19:23:00
votersebastianboldt
authorchasewest
permlinkapi-resources-for-cryptocurrencies
weight10000 (100.00%)
Transaction InfoBlock #17597249/Trx 80bb6f49917f31fcd5ead8f1993627f4ab125e52
View Raw JSON Data
{
  "trx_id": "80bb6f49917f31fcd5ead8f1993627f4ab125e52",
  "block": 17597249,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-27T19:23:00",
  "op": [
    "vote",
    {
      "voter": "sebastianboldt",
      "author": "chasewest",
      "permlink": "api-resources-for-cryptocurrencies",
      "weight": 10000
    }
  ]
}
2017/11/19 15:14:18
voterregisek
authorsebastianboldt
permlink7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
weight10000 (100.00%)
Transaction InfoBlock #17361990/Trx 83e00b0595c90f4622b8f2d2e0f0d986f14b2f80
View Raw JSON Data
{
  "trx_id": "83e00b0595c90f4622b8f2d2e0f0d986f14b2f80",
  "block": 17361990,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-19T15:14:18",
  "op": [
    "vote",
    {
      "voter": "regisek",
      "author": "sebastianboldt",
      "permlink": "7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "weight": 10000
    }
  ]
}
2017/11/17 17:55:39
authorsebastianboldt
permlink7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
sbd payout0.231 SBD
steem payout0.000 STEEM
vesting payout509.333404 VESTS
Transaction InfoBlock #17307634/Virtual Operation #5
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 17307634,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 5,
  "timestamp": "2017-11-17T17:55:39",
  "op": [
    "author_reward",
    {
      "author": "sebastianboldt",
      "permlink": "7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "sbd_payout": "0.231 SBD",
      "steem_payout": "0.000 STEEM",
      "vesting_payout": "509.333404 VESTS"
    }
  ]
}
2017/11/17 17:55:39
curatorsebastianboldt
reward8.215054 VESTS
comment authorsebastianboldt
comment permlink7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
Transaction InfoBlock #17307634/Virtual Operation #3
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 17307634,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 3,
  "timestamp": "2017-11-17T17:55:39",
  "op": [
    "curation_reward",
    {
      "curator": "sebastianboldt",
      "reward": "8.215054 VESTS",
      "comment_author": "sebastianboldt",
      "comment_permlink": "7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes"
    }
  ]
}
2017/11/11 08:37:21
voterpapasloppa
authorsebastianboldt
permlink7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
weight10000 (100.00%)
Transaction InfoBlock #17123694/Trx c710758d3dbe316e701bcfd09596e922042a2eb1
View Raw JSON Data
{
  "trx_id": "c710758d3dbe316e701bcfd09596e922042a2eb1",
  "block": 17123694,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-11T08:37:21",
  "op": [
    "vote",
    {
      "voter": "papasloppa",
      "author": "sebastianboldt",
      "permlink": "7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "weight": 10000
    }
  ]
}
2017/11/10 20:34:24
voterko4nevaal
authorsebastianboldt
permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
weight10000 (100.00%)
Transaction InfoBlock #17109235/Trx c52abb5a09c6ae9407f096b57ab084cea0ab7931
View Raw JSON Data
{
  "trx_id": "c52abb5a09c6ae9407f096b57ab084cea0ab7931",
  "block": 17109235,
  "trx_in_block": 14,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T20:34:24",
  "op": [
    "vote",
    {
      "voter": "ko4nevaal",
      "author": "sebastianboldt",
      "permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "weight": 10000
    }
  ]
}
2017/11/10 20:34:24
voterotkova
authorsebastianboldt
permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
weight10000 (100.00%)
Transaction InfoBlock #17109235/Trx 51cb85ed0a7b507923763c557a32c3ac7f1c4361
View Raw JSON Data
{
  "trx_id": "51cb85ed0a7b507923763c557a32c3ac7f1c4361",
  "block": 17109235,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T20:34:24",
  "op": [
    "vote",
    {
      "voter": "otkova",
      "author": "sebastianboldt",
      "permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "weight": 10000
    }
  ]
}
2017/11/10 20:34:21
voterleksovalish
authorsebastianboldt
permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
weight10000 (100.00%)
Transaction InfoBlock #17109234/Trx 6745a14016983e52da5a574abbe2687d6874870d
View Raw JSON Data
{
  "trx_id": "6745a14016983e52da5a574abbe2687d6874870d",
  "block": 17109234,
  "trx_in_block": 23,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T20:34:21",
  "op": [
    "vote",
    {
      "voter": "leksovalish",
      "author": "sebastianboldt",
      "permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "weight": 10000
    }
  ]
}
2017/11/10 19:44:33
votersebastianboldt
authoralcibiades
permlinkstreet-photography-with-a-cinematic-look-street-life-5
weight10000 (100.00%)
Transaction InfoBlock #17108238/Trx b5629a28696e1a97367bfed27db3f4a25f18c670
View Raw JSON Data
{
  "trx_id": "b5629a28696e1a97367bfed27db3f4a25f18c670",
  "block": 17108238,
  "trx_in_block": 23,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T19:44:33",
  "op": [
    "vote",
    {
      "voter": "sebastianboldt",
      "author": "alcibiades",
      "permlink": "street-photography-with-a-cinematic-look-street-life-5",
      "weight": 10000
    }
  ]
}
2017/11/10 19:33:00
votergeekgirl
authorsebastianboldt
permlink7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
weight10000 (100.00%)
Transaction InfoBlock #17108007/Trx 3c10a51b022d83b2299d9b5c7282d9e946ae8b49
View Raw JSON Data
{
  "trx_id": "3c10a51b022d83b2299d9b5c7282d9e946ae8b49",
  "block": 17108007,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T19:33:00",
  "op": [
    "vote",
    {
      "voter": "geekgirl",
      "author": "sebastianboldt",
      "permlink": "7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "weight": 10000
    }
  ]
}
2017/11/10 18:28:39
parent author
parent permlinkprogramming
authorsebastianboldt
permlink7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
titleMy iOS Development Toolkit for 2018
body@@ -134,230 +134,8 @@ g)%0A%0A -### If you like the content I provide for free I would really appreciate if you could give this article an upvote on steemit. Thanks in advance . %5Bhttps://steemit.com/@sebastianboldt%5D(https://steemit.com/@sebastianboldt)%0A%0A This @@ -302,18 +302,16 @@ called %5B -** Fabric%5D( @@ -332,25 +332,21 @@ bric.io) -** %0A%0A* %5B -** Testflig @@ -386,26 +386,24 @@ estflight/) -** is a native @@ -439,18 +439,16 @@ ork%0A%0A* %5B -** Smooch%5D( @@ -466,18 +466,16 @@ och.io) -** is a gre @@ -576,18 +576,16 @@ s with %5B -** Mixpanel @@ -603,26 +603,24 @@ ixpanel.com) -** %0A%0A* I use %5B* @@ -618,18 +618,16 @@ I use %5B -** Trello%5D( @@ -645,18 +645,16 @@ llo.com) -** to mana @@ -731,18 +731,16 @@ l like %5B -** JIRA%5D(ht @@ -981,18 +981,17 @@ 3jg0KQ) -** + directly @@ -1020,21 +1020,17 @@ pository -** ** + in conju @@ -1040,18 +1040,16 @@ ion with -** %5BSCRUM%5D @@ -1117,16 +1117,13 @@ 29) -** and -** + %5BGit @@ -1198,18 +1198,16 @@ kflows/) -** %0A%0A### To @@ -1250,18 +1250,16 @@ using %5B -** Fastlane @@ -1285,18 +1285,16 @@ tools). -** It autom @@ -1493,18 +1493,16 @@ I use %5B -** PAW%5D(htt @@ -1835,18 +1835,16 @@ tBaAOA) -** for test @@ -1871,20 +1871,16 @@ RESTful -**** APIs%0A%0A* @@ -1918,18 +1918,16 @@ using %5B -** Instrume @@ -2047,25 +2047,21 @@ ex.html) -** %0A%0A* %5B -** Jazzy%5D(h @@ -2090,18 +2090,16 @@ m/jazzy) -** is a co @@ -2195,26 +2195,18 @@ ing -** GIT -** I can -**** high @@ -2219,18 +2219,16 @@ ommend %5B -** Source T @@ -2258,26 +2258,24 @@ treeapp.com) -** %0A%0A* When wor @@ -2315,18 +2315,16 @@ using %5B -** Atom%5D(ht @@ -2338,18 +2338,16 @@ tom.io) -** over *Xc @@ -2395,18 +2395,16 @@ called %5B -** Alcatraz @@ -2420,26 +2420,24 @@ alcatraz.io) -** %0A%0A* Access s @@ -2493,18 +2493,16 @@ r with %5B -** SimPhold @@ -2530,25 +2530,21 @@ ers.com) -** %0A%0A* %5B -** Cocoa Po @@ -2565,26 +2565,24 @@ coapods.org) -** is a depend @@ -2623,18 +2623,16 @@ pps%0A%0A* %5B -** Carthage @@ -2671,27 +2671,21 @@ rthage) -** is a -** ** + simple, @@ -2789,18 +2789,16 @@ ce use %5B -** Charles%5D @@ -2823,26 +2823,24 @@ esproxy.com) -** %0A%0A* Improve @@ -2899,18 +2899,16 @@ called %5B -** Chisel%5D( @@ -2942,18 +2942,16 @@ /chisel) -** %0A%0A* Turn @@ -2976,18 +2976,16 @@ e with %5B -** Paint Co @@ -3016,25 +3016,21 @@ app.com) -** %0A%0A* %5B -** Icons8 A @@ -3048,26 +3048,24 @@ /icons8.com) -** provides 23 @@ -3114,18 +3114,16 @@ ent%0A%0A* %5B -** Pixelmat @@ -3162,19 +3162,13 @@ c/) -** is a -** ** + grea @@ -3216,18 +3216,16 @@ OS%0A%0A* %5B -** Power JS @@ -3274,18 +3274,16 @@ editor/) -** is a gr @@ -3338,18 +3338,16 @@ %0A* With -** %5BSip%5D(ht @@ -3361,18 +3361,16 @@ papp.io) -** you can @@ -3413,18 +3413,16 @@ rs.%0A%0A* %5B -** Kap%5D(htt @@ -3436,18 +3436,16 @@ tkap.co) -** is an o @@ -3507,18 +3507,16 @@ I use %5B -** Pocket%5D( @@ -3537,18 +3537,16 @@ ket.com) -** across @@ -3600,18 +3600,16 @@ ad.%0A%0A* %5B -** CCMenu%5D( @@ -3665,18 +3665,16 @@ 8?mt=12) -** display @@ -3807,18 +3807,16 @@ ies%0A%0A* %5B -** Awesome- @@ -3858,18 +3858,16 @@ ome-ios) -** is a cu @@ -3963,18 +3963,16 @@ using %5B -** AFNetwor @@ -3997,18 +3997,16 @@ working) -** %0A%0A* Netw @@ -4038,18 +4038,16 @@ using %5B -** Alamofir @@ -4088,25 +4088,21 @@ amofire) -** %0A%0A* %5B -** PromiseK @@ -4127,18 +4127,16 @@ kit.org) -** make as @@ -4191,18 +4191,16 @@ ts.%0A%0A* %5B -** Jelly%5D(h @@ -4238,18 +4238,16 @@ t/Jelly) -** provide @@ -4317,18 +4317,16 @@ ode%0A%0A* %5B -** AudioKit @@ -4346,18 +4346,16 @@ okit.io) -** is a po @@ -4416,18 +4416,16 @@ ork%0A%0A* %5B -** FBTweaks @@ -4461,18 +4461,16 @@ /Tweaks) -** is a gr @@ -4547,21 +4547,15 @@ Git -**** called -** %5BGit @@ -4630,25 +4630,21 @@ kflows/) -** %0A%0A* %5B -** Realm%5D(h @@ -4679,18 +4679,16 @@ atest/) -** is a gre @@ -4812,18 +4812,16 @@ using %5B -** R.swift%5D @@ -4859,18 +4859,16 @@ R.swift) -** %0A%0A* Visu @@ -4937,18 +4937,16 @@ d with %5B -** COSTouch @@ -5004,25 +5004,21 @@ ualizer) -** %0A%0A* %5B -** SwiftLin @@ -5055,18 +5055,16 @@ iftLint) -** is a to @@ -5176,18 +5176,16 @@ ous%0A%0A* %5B -** Terminal @@ -5197,18 +5197,16 @@ t-Sheet -** %5D(https: @@ -5329,18 +5329,16 @@ tes%0A%0A* %5B -** Ray Wend @@ -5380,23 +5380,17 @@ om) -** provides -** ** + high @@ -5453,18 +5453,16 @@ ials on -** %5BObjc.io @@ -5483,25 +5483,21 @@ objc.io) -** %0A%0A* %5B -** NSHipste @@ -5517,26 +5517,24 @@ ipster.com) -** is a journal @@ -5661,18 +5661,16 @@ pment. %5B -** NSScreen @@ -5708,18 +5708,16 @@ pisodes) -** %0A%0A* A st @@ -5753,18 +5753,16 @@ called -** %5BNatasha @@ -5805,18 +5805,16 @@ bot.com) -** %0A%0A* Crea @@ -5824,18 +5824,16 @@ useful . -** gitignor @@ -5833,18 +5833,16 @@ itignore -** files f @@ -5861,18 +5861,16 @@ ect on %5B -** gitignor @@ -5900,25 +5900,21 @@ nore.io) -** %0A%0A* %5B -** Pttrns%5D( @@ -5932,18 +5932,16 @@ ns.com) -** is a col @@ -6053,18 +6053,16 @@ ces on %5B -** iOSDev.t @@ -6092,17 +6092,13 @@ ols) -** %0A%0A* %5B -** Coco @@ -6139,18 +6139,16 @@ ols.com) -** provide @@ -6179,17 +6179,16 @@ mponents - %0Afor iOS @@ -6244,18 +6244,16 @@ cles on -** %5BNSHint%5D @@ -6270,18 +6270,16 @@ hint.io) -** %0A%0A* Grea @@ -6305,18 +6305,16 @@ nd co. %5B -** khanlou%5D @@ -6333,18 +6333,16 @@ lou.com) -** %0A%0A### Po @@ -6352,18 +6352,16 @@ sts%0A%0A* %5B -** Core Int @@ -6391,18 +6391,16 @@ int.org) -** is a po @@ -6489,18 +6489,16 @@ es.%0A%0A* %5B -** iPhreaks @@ -6528,18 +6528,16 @@ hreaks/) -** provide @@ -6643,18 +6643,16 @@ Podcast -** %5BThe Ray @@ -6715,18 +6715,16 @@ podcast) -** %0A%0AFeel f @@ -6741,18 +6741,16 @@ me on %5B -** github%5D( @@ -6787,15 +6787,11 @@ ldt) -** , %5B -** twit @@ -6900,15 +6900,11 @@ 61) -** or -** %5Bxin @@ -6964,18 +6964,16 @@ =mxb_p) -** if you h @@ -7057,18 +7057,16 @@ cks on %5B -** SoundClo @@ -7112,17 +7112,13 @@ ldt) -** ;)%0A%5B -** Seba @@ -7149,10 +7149,8 @@ ldt) -** %0A*Se
json metadata{"tags":["programming","ios","cocoa","swift"],"links":["https://get.fabric.io","https://developer.apple.com/testflight/","https://smooch.io","https://mixpanel.com","https://trello.com","https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiew4HR493LAhWsIpoKHRa1Dl4QFggpMAA&url=https%3A%2F%2Fde.atlassian.com%2Fsoftware%2Fjira&usg=AFQjCNG7Qw8fibiPjAvoxyU83uCs4lUEJQ&sig2=4VlRGoUgjj2bwQSc3jg0KQ","https://en.wikipedia.org/wiki/Scrum_%28software_development%29","https://www.atlassian.com/git/tutorials/comparing-workflows/","https://fastlane.tools","https://luckymarmot.com/de/paw","https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjS1KvAnMDMAhUBJMAKHXclCG8QFggdMAA&url=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Fpostman%2Ffhbjgbiflinjbdggehcddcbncdddomop&usg=AFQjCNEKwgqPDcgrMAsS6iZ8PUYhTzB58A&sig2=IBr-c8l-FnJjzwP0tBaAOA","https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html","https://github.com/realm/jazzy","https://www.sourcetreeapp.com","https://atom.io","http://alcatraz.io","https://simpholders.com","https://cocoapods.org","https://github.com/Carthage/Carthage","https://www.charlesproxy.com","https://github.com/facebook/chisel","http://www.paintcodeapp.com","https://icons8.com","http://www.pixelmator.com/mac/","https://tickplant.com/powerjsoneditor/","http://sipapp.io","https://getkap.co","https://getpocket.com","https://itunes.apple.com/de/app/ccmenu/id603117688?mt=12","https://github.com/vsouza/awesome-ios","http://AFNetworking","https://github.com/Alamofire/Alamofire","http://promisekit.org","https://github.com/SebastianBoldt/Jelly","http://audiokit.io","https://github.com/facebook/Tweaks","https://realm.io/docs/swift/latest/","https://github.com/mac-cain13/R.swift","https://github.com/conopsys/COSTouchVisualizer","https://github.com/realm/SwiftLint","https://github.com/SebastianBoldt/Terminal-Cheatsheet","https://www.raywenderlich.com","https://www.objc.io","http://nshipster.com","http://nsscreencast.com/episodes","https://www.natashatherobot.com","https://www.gitignore.io","http://pttrns.com","https://iosdev.tools","https://www.cocoacontrols.com","http://nshint.io","http://khanlou.com","http://www.coreint.org","https://devchat.tv/iphreaks/","https://www.raywenderlich.com/rwpodcast","https://github.com/SebastianBoldt","https://twitter.com/sebastianboldt","https://de.linkedin.com/in/sebastian-boldt-9b465261","https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p","https://soundcloud.com/sebastian_boldt"],"app":"steemit/0.1","format":"markdown","image":["https://cdn-images-1.medium.com/max/4000/1*i3SuhBo3VEC8G79ee1CQ5w.jpeg"]}
Transaction InfoBlock #17106720/Trx 50c698384ecca2651f60d16b8c2263afed784114
View Raw JSON Data
{
  "trx_id": "50c698384ecca2651f60d16b8c2263afed784114",
  "block": 17106720,
  "trx_in_block": 26,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T18:28:39",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "programming",
      "author": "sebastianboldt",
      "permlink": "7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "title": "My iOS Development Toolkit for 2018",
      "body": "@@ -134,230 +134,8 @@\n g)%0A%0A\n-### If you like the content I provide for free I would really appreciate if you could give this article an upvote on steemit. Thanks in advance . %5Bhttps://steemit.com/@sebastianboldt%5D(https://steemit.com/@sebastianboldt)%0A%0A\n This\n@@ -302,18 +302,16 @@\n called %5B\n-**\n Fabric%5D(\n@@ -332,25 +332,21 @@\n bric.io)\n-**\n %0A%0A* %5B\n-**\n Testflig\n@@ -386,26 +386,24 @@\n estflight/) \n-**\n is a native \n@@ -439,18 +439,16 @@\n ork%0A%0A* %5B\n-**\n Smooch%5D(\n@@ -466,18 +466,16 @@\n och.io) \n-**\n is a gre\n@@ -576,18 +576,16 @@\n s with %5B\n-**\n Mixpanel\n@@ -603,26 +603,24 @@\n ixpanel.com)\n-**\n %0A%0A* I use %5B*\n@@ -618,18 +618,16 @@\n  I use %5B\n-**\n Trello%5D(\n@@ -645,18 +645,16 @@\n llo.com)\n-**\n  to mana\n@@ -731,18 +731,16 @@\n l like %5B\n-**\n JIRA%5D(ht\n@@ -981,18 +981,17 @@\n 3jg0KQ) \n-**\n+ \n directly\n@@ -1020,21 +1020,17 @@\n pository\n-** **\n+ \n in conju\n@@ -1040,18 +1040,16 @@\n ion with\n-**\n  %5BSCRUM%5D\n@@ -1117,16 +1117,13 @@\n 29) \n-**\n and \n-**\n+ \n %5BGit\n@@ -1198,18 +1198,16 @@\n kflows/)\n-**\n %0A%0A### To\n@@ -1250,18 +1250,16 @@\n  using %5B\n-**\n Fastlane\n@@ -1285,18 +1285,16 @@\n tools). \n-**\n It autom\n@@ -1493,18 +1493,16 @@\n  I use %5B\n-**\n PAW%5D(htt\n@@ -1835,18 +1835,16 @@\n tBaAOA) \n-**\n for test\n@@ -1871,20 +1871,16 @@\n RESTful \n-****\n APIs%0A%0A* \n@@ -1918,18 +1918,16 @@\n  using %5B\n-**\n Instrume\n@@ -2047,25 +2047,21 @@\n ex.html)\n-**\n %0A%0A* %5B\n-**\n Jazzy%5D(h\n@@ -2090,18 +2090,16 @@\n m/jazzy)\n-**\n  is a co\n@@ -2195,26 +2195,18 @@\n ing \n-**\n GIT \n-**\n I can \n-****\n high\n@@ -2219,18 +2219,16 @@\n ommend %5B\n-**\n Source T\n@@ -2258,26 +2258,24 @@\n treeapp.com)\n-**\n %0A%0A* When wor\n@@ -2315,18 +2315,16 @@\n  using %5B\n-**\n Atom%5D(ht\n@@ -2338,18 +2338,16 @@\n tom.io) \n-**\n over *Xc\n@@ -2395,18 +2395,16 @@\n called %5B\n-**\n Alcatraz\n@@ -2420,26 +2420,24 @@\n alcatraz.io)\n-**\n %0A%0A* Access s\n@@ -2493,18 +2493,16 @@\n r with %5B\n-**\n SimPhold\n@@ -2530,25 +2530,21 @@\n ers.com)\n-**\n %0A%0A* %5B\n-**\n Cocoa Po\n@@ -2565,26 +2565,24 @@\n coapods.org)\n-**\n  is a depend\n@@ -2623,18 +2623,16 @@\n pps%0A%0A* %5B\n-**\n Carthage\n@@ -2671,27 +2671,21 @@\n rthage) \n-**\n is a\n-** **\n+ \n simple, \n@@ -2789,18 +2789,16 @@\n ce use %5B\n-**\n Charles%5D\n@@ -2823,26 +2823,24 @@\n esproxy.com)\n-**\n %0A%0A* Improve \n@@ -2899,18 +2899,16 @@\n called %5B\n-**\n Chisel%5D(\n@@ -2942,18 +2942,16 @@\n /chisel)\n-**\n %0A%0A* Turn\n@@ -2976,18 +2976,16 @@\n e with %5B\n-**\n Paint Co\n@@ -3016,25 +3016,21 @@\n app.com)\n-**\n %0A%0A* %5B\n-**\n Icons8 A\n@@ -3048,26 +3048,24 @@\n /icons8.com)\n-**\n  provides 23\n@@ -3114,18 +3114,16 @@\n ent%0A%0A* %5B\n-**\n Pixelmat\n@@ -3162,19 +3162,13 @@\n c/) \n-**\n is a\n-** **\n+ \n grea\n@@ -3216,18 +3216,16 @@\n  OS%0A%0A* %5B\n-**\n Power JS\n@@ -3274,18 +3274,16 @@\n editor/)\n-**\n  is a gr\n@@ -3338,18 +3338,16 @@\n %0A* With \n-**\n %5BSip%5D(ht\n@@ -3361,18 +3361,16 @@\n papp.io)\n-**\n  you can\n@@ -3413,18 +3413,16 @@\n rs.%0A%0A* %5B\n-**\n Kap%5D(htt\n@@ -3436,18 +3436,16 @@\n tkap.co)\n-**\n  is an o\n@@ -3507,18 +3507,16 @@\n  I use %5B\n-**\n Pocket%5D(\n@@ -3537,18 +3537,16 @@\n ket.com)\n-**\n  across \n@@ -3600,18 +3600,16 @@\n ad.%0A%0A* %5B\n-**\n CCMenu%5D(\n@@ -3665,18 +3665,16 @@\n 8?mt=12)\n-**\n  display\n@@ -3807,18 +3807,16 @@\n ies%0A%0A* %5B\n-**\n Awesome-\n@@ -3858,18 +3858,16 @@\n ome-ios)\n-**\n  is a cu\n@@ -3963,18 +3963,16 @@\n  using %5B\n-**\n AFNetwor\n@@ -3997,18 +3997,16 @@\n working)\n-**\n %0A%0A* Netw\n@@ -4038,18 +4038,16 @@\n  using %5B\n-**\n Alamofir\n@@ -4088,25 +4088,21 @@\n amofire)\n-**\n %0A%0A* %5B\n-**\n PromiseK\n@@ -4127,18 +4127,16 @@\n kit.org)\n-**\n  make as\n@@ -4191,18 +4191,16 @@\n ts.%0A%0A* %5B\n-**\n Jelly%5D(h\n@@ -4238,18 +4238,16 @@\n t/Jelly)\n-**\n  provide\n@@ -4317,18 +4317,16 @@\n ode%0A%0A* %5B\n-**\n AudioKit\n@@ -4346,18 +4346,16 @@\n okit.io)\n-**\n  is a po\n@@ -4416,18 +4416,16 @@\n ork%0A%0A* %5B\n-**\n FBTweaks\n@@ -4461,18 +4461,16 @@\n /Tweaks)\n-**\n  is a gr\n@@ -4547,21 +4547,15 @@\n Git \n-****\n called \n-**\n %5BGit\n@@ -4630,25 +4630,21 @@\n kflows/)\n-**\n %0A%0A* %5B\n-**\n Realm%5D(h\n@@ -4679,18 +4679,16 @@\n atest/) \n-**\n is a gre\n@@ -4812,18 +4812,16 @@\n  using %5B\n-**\n R.swift%5D\n@@ -4859,18 +4859,16 @@\n R.swift)\n-**\n %0A%0A* Visu\n@@ -4937,18 +4937,16 @@\n d with %5B\n-**\n COSTouch\n@@ -5004,25 +5004,21 @@\n ualizer)\n-**\n %0A%0A* %5B\n-**\n SwiftLin\n@@ -5055,18 +5055,16 @@\n iftLint)\n-**\n  is a to\n@@ -5176,18 +5176,16 @@\n ous%0A%0A* %5B\n-**\n Terminal\n@@ -5197,18 +5197,16 @@\n t-Sheet \n-**\n %5D(https:\n@@ -5329,18 +5329,16 @@\n tes%0A%0A* %5B\n-**\n Ray Wend\n@@ -5380,23 +5380,17 @@\n om) \n-**\n provides\n-** **\n+ \n high\n@@ -5453,18 +5453,16 @@\n ials on \n-**\n %5BObjc.io\n@@ -5483,25 +5483,21 @@\n objc.io)\n-**\n %0A%0A* %5B\n-**\n NSHipste\n@@ -5517,26 +5517,24 @@\n ipster.com) \n-**\n is a journal\n@@ -5661,18 +5661,16 @@\n pment. %5B\n-**\n NSScreen\n@@ -5708,18 +5708,16 @@\n pisodes)\n-**\n %0A%0A* A st\n@@ -5753,18 +5753,16 @@\n  called \n-**\n %5BNatasha\n@@ -5805,18 +5805,16 @@\n bot.com)\n-**\n %0A%0A* Crea\n@@ -5824,18 +5824,16 @@\n useful .\n-**\n gitignor\n@@ -5833,18 +5833,16 @@\n itignore\n-**\n  files f\n@@ -5861,18 +5861,16 @@\n ect on %5B\n-**\n gitignor\n@@ -5900,25 +5900,21 @@\n nore.io)\n-**\n %0A%0A* %5B\n-**\n Pttrns%5D(\n@@ -5932,18 +5932,16 @@\n ns.com) \n-**\n is a col\n@@ -6053,18 +6053,16 @@\n ces on %5B\n-**\n iOSDev.t\n@@ -6092,17 +6092,13 @@\n ols)\n-**\n %0A%0A* %5B\n-**\n Coco\n@@ -6139,18 +6139,16 @@\n ols.com)\n-**\n  provide\n@@ -6179,17 +6179,16 @@\n mponents\n- \n %0Afor iOS\n@@ -6244,18 +6244,16 @@\n cles on \n-**\n %5BNSHint%5D\n@@ -6270,18 +6270,16 @@\n hint.io)\n-**\n %0A%0A* Grea\n@@ -6305,18 +6305,16 @@\n nd co. %5B\n-**\n khanlou%5D\n@@ -6333,18 +6333,16 @@\n lou.com)\n-**\n %0A%0A### Po\n@@ -6352,18 +6352,16 @@\n sts%0A%0A* %5B\n-**\n Core Int\n@@ -6391,18 +6391,16 @@\n int.org)\n-**\n  is a po\n@@ -6489,18 +6489,16 @@\n es.%0A%0A* %5B\n-**\n iPhreaks\n@@ -6528,18 +6528,16 @@\n hreaks/)\n-**\n  provide\n@@ -6643,18 +6643,16 @@\n Podcast \n-**\n %5BThe Ray\n@@ -6715,18 +6715,16 @@\n podcast)\n-**\n %0A%0AFeel f\n@@ -6741,18 +6741,16 @@\n  me on %5B\n-**\n github%5D(\n@@ -6787,15 +6787,11 @@\n ldt)\n-**\n , %5B\n-**\n twit\n@@ -6900,15 +6900,11 @@\n 61) \n-**\n or \n-**\n %5Bxin\n@@ -6964,18 +6964,16 @@\n =mxb_p) \n-**\n if you h\n@@ -7057,18 +7057,16 @@\n cks on %5B\n-**\n SoundClo\n@@ -7112,17 +7112,13 @@\n ldt)\n-**\n  ;)%0A%5B\n-**\n Seba\n@@ -7149,10 +7149,8 @@\n ldt)\n-**\n %0A*Se\n",
      "json_metadata": "{\"tags\":[\"programming\",\"ios\",\"cocoa\",\"swift\"],\"links\":[\"https://get.fabric.io\",\"https://developer.apple.com/testflight/\",\"https://smooch.io\",\"https://mixpanel.com\",\"https://trello.com\",\"https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiew4HR493LAhWsIpoKHRa1Dl4QFggpMAA&url=https%3A%2F%2Fde.atlassian.com%2Fsoftware%2Fjira&usg=AFQjCNG7Qw8fibiPjAvoxyU83uCs4lUEJQ&sig2=4VlRGoUgjj2bwQSc3jg0KQ\",\"https://en.wikipedia.org/wiki/Scrum_%28software_development%29\",\"https://www.atlassian.com/git/tutorials/comparing-workflows/\",\"https://fastlane.tools\",\"https://luckymarmot.com/de/paw\",\"https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjS1KvAnMDMAhUBJMAKHXclCG8QFggdMAA&url=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Fpostman%2Ffhbjgbiflinjbdggehcddcbncdddomop&usg=AFQjCNEKwgqPDcgrMAsS6iZ8PUYhTzB58A&sig2=IBr-c8l-FnJjzwP0tBaAOA\",\"https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html\",\"https://github.com/realm/jazzy\",\"https://www.sourcetreeapp.com\",\"https://atom.io\",\"http://alcatraz.io\",\"https://simpholders.com\",\"https://cocoapods.org\",\"https://github.com/Carthage/Carthage\",\"https://www.charlesproxy.com\",\"https://github.com/facebook/chisel\",\"http://www.paintcodeapp.com\",\"https://icons8.com\",\"http://www.pixelmator.com/mac/\",\"https://tickplant.com/powerjsoneditor/\",\"http://sipapp.io\",\"https://getkap.co\",\"https://getpocket.com\",\"https://itunes.apple.com/de/app/ccmenu/id603117688?mt=12\",\"https://github.com/vsouza/awesome-ios\",\"http://AFNetworking\",\"https://github.com/Alamofire/Alamofire\",\"http://promisekit.org\",\"https://github.com/SebastianBoldt/Jelly\",\"http://audiokit.io\",\"https://github.com/facebook/Tweaks\",\"https://realm.io/docs/swift/latest/\",\"https://github.com/mac-cain13/R.swift\",\"https://github.com/conopsys/COSTouchVisualizer\",\"https://github.com/realm/SwiftLint\",\"https://github.com/SebastianBoldt/Terminal-Cheatsheet\",\"https://www.raywenderlich.com\",\"https://www.objc.io\",\"http://nshipster.com\",\"http://nsscreencast.com/episodes\",\"https://www.natashatherobot.com\",\"https://www.gitignore.io\",\"http://pttrns.com\",\"https://iosdev.tools\",\"https://www.cocoacontrols.com\",\"http://nshint.io\",\"http://khanlou.com\",\"http://www.coreint.org\",\"https://devchat.tv/iphreaks/\",\"https://www.raywenderlich.com/rwpodcast\",\"https://github.com/SebastianBoldt\",\"https://twitter.com/sebastianboldt\",\"https://de.linkedin.com/in/sebastian-boldt-9b465261\",\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\",\"https://soundcloud.com/sebastian_boldt\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"image\":[\"https://cdn-images-1.medium.com/max/4000/1*i3SuhBo3VEC8G79ee1CQ5w.jpeg\"]}"
    }
  ]
}
2017/11/10 18:28:30
parent author
parent permlinkprogramming
authorsebastianboldt
permlink7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
titleMy iOS Development Toolkit 2017
body@@ -134,230 +134,8 @@ g)%0A%0A -### If you like the content I provide for free I would really appreciate if you could give this article an upvote on steemit. Thanks in advance . %5Bhttps://steemit.com/@sebastianboldt%5D(https://steemit.com/@sebastianboldt)%0A%0A This @@ -302,18 +302,16 @@ called %5B -** Fabric%5D( @@ -332,25 +332,21 @@ bric.io) -** %0A%0A* %5B -** Testflig @@ -386,26 +386,24 @@ estflight/) -** is a native @@ -439,18 +439,16 @@ ork%0A%0A* %5B -** Smooch%5D( @@ -466,18 +466,16 @@ och.io) -** is a gre @@ -576,18 +576,16 @@ s with %5B -** Mixpanel @@ -603,26 +603,24 @@ ixpanel.com) -** %0A%0A* I use %5B* @@ -618,18 +618,16 @@ I use %5B -** Trello%5D( @@ -645,18 +645,16 @@ llo.com) -** to mana @@ -731,18 +731,16 @@ l like %5B -** JIRA%5D(ht @@ -981,18 +981,17 @@ 3jg0KQ) -** + directly @@ -1020,21 +1020,17 @@ pository -** ** + in conju @@ -1040,18 +1040,16 @@ ion with -** %5BSCRUM%5D @@ -1117,16 +1117,13 @@ 29) -** and -** + %5BGit @@ -1198,18 +1198,16 @@ kflows/) -** %0A%0A### To @@ -1250,18 +1250,16 @@ using %5B -** Fastlane @@ -1285,18 +1285,16 @@ tools). -** It autom @@ -1493,18 +1493,16 @@ I use %5B -** PAW%5D(htt @@ -1835,18 +1835,16 @@ tBaAOA) -** for test @@ -1871,20 +1871,16 @@ RESTful -**** APIs%0A%0A* @@ -1918,18 +1918,16 @@ using %5B -** Instrume @@ -2047,25 +2047,21 @@ ex.html) -** %0A%0A* %5B -** Jazzy%5D(h @@ -2090,18 +2090,16 @@ m/jazzy) -** is a co @@ -2195,26 +2195,18 @@ ing -** GIT -** I can -**** high @@ -2219,18 +2219,16 @@ ommend %5B -** Source T @@ -2258,26 +2258,24 @@ treeapp.com) -** %0A%0A* When wor @@ -2315,18 +2315,16 @@ using %5B -** Atom%5D(ht @@ -2338,18 +2338,16 @@ tom.io) -** over *Xc @@ -2395,18 +2395,16 @@ called %5B -** Alcatraz @@ -2420,26 +2420,24 @@ alcatraz.io) -** %0A%0A* Access s @@ -2493,18 +2493,16 @@ r with %5B -** SimPhold @@ -2530,25 +2530,21 @@ ers.com) -** %0A%0A* %5B -** Cocoa Po @@ -2565,26 +2565,24 @@ coapods.org) -** is a depend @@ -2623,18 +2623,16 @@ pps%0A%0A* %5B -** Carthage @@ -2671,27 +2671,21 @@ rthage) -** is a -** ** + simple, @@ -2789,18 +2789,16 @@ ce use %5B -** Charles%5D @@ -2823,26 +2823,24 @@ esproxy.com) -** %0A%0A* Improve @@ -2899,18 +2899,16 @@ called %5B -** Chisel%5D( @@ -2942,18 +2942,16 @@ /chisel) -** %0A%0A* Turn @@ -2976,18 +2976,16 @@ e with %5B -** Paint Co @@ -3016,25 +3016,21 @@ app.com) -** %0A%0A* %5B -** Icons8 A @@ -3048,26 +3048,24 @@ /icons8.com) -** provides 23 @@ -3114,18 +3114,16 @@ ent%0A%0A* %5B -** Pixelmat @@ -3162,19 +3162,13 @@ c/) -** is a -** ** + grea @@ -3216,18 +3216,16 @@ OS%0A%0A* %5B -** Power JS @@ -3274,18 +3274,16 @@ editor/) -** is a gr @@ -3338,18 +3338,16 @@ %0A* With -** %5BSip%5D(ht @@ -3361,18 +3361,16 @@ papp.io) -** you can @@ -3413,18 +3413,16 @@ rs.%0A%0A* %5B -** Kap%5D(htt @@ -3436,18 +3436,16 @@ tkap.co) -** is an o @@ -3507,18 +3507,16 @@ I use %5B -** Pocket%5D( @@ -3537,18 +3537,16 @@ ket.com) -** across @@ -3600,18 +3600,16 @@ ad.%0A%0A* %5B -** CCMenu%5D( @@ -3665,18 +3665,16 @@ 8?mt=12) -** display @@ -3807,18 +3807,16 @@ ies%0A%0A* %5B -** Awesome- @@ -3858,18 +3858,16 @@ ome-ios) -** is a cu @@ -3963,18 +3963,16 @@ using %5B -** AFNetwor @@ -3997,18 +3997,16 @@ working) -** %0A%0A* Netw @@ -4038,18 +4038,16 @@ using %5B -** Alamofir @@ -4088,25 +4088,21 @@ amofire) -** %0A%0A* %5B -** PromiseK @@ -4127,18 +4127,16 @@ kit.org) -** make as @@ -4191,18 +4191,16 @@ ts.%0A%0A* %5B -** Jelly%5D(h @@ -4238,18 +4238,16 @@ t/Jelly) -** provide @@ -4317,18 +4317,16 @@ ode%0A%0A* %5B -** AudioKit @@ -4346,18 +4346,16 @@ okit.io) -** is a po @@ -4416,18 +4416,16 @@ ork%0A%0A* %5B -** FBTweaks @@ -4461,18 +4461,16 @@ /Tweaks) -** is a gr @@ -4547,21 +4547,15 @@ Git -**** called -** %5BGit @@ -4630,25 +4630,21 @@ kflows/) -** %0A%0A* %5B -** Realm%5D(h @@ -4679,18 +4679,16 @@ atest/) -** is a gre @@ -4812,18 +4812,16 @@ using %5B -** R.swift%5D @@ -4859,18 +4859,16 @@ R.swift) -** %0A%0A* Visu @@ -4937,18 +4937,16 @@ d with %5B -** COSTouch @@ -5004,25 +5004,21 @@ ualizer) -** %0A%0A* %5B -** SwiftLin @@ -5055,18 +5055,16 @@ iftLint) -** is a to @@ -5176,18 +5176,16 @@ ous%0A%0A* %5B -** Terminal @@ -5197,18 +5197,16 @@ t-Sheet -** %5D(https: @@ -5329,18 +5329,16 @@ tes%0A%0A* %5B -** Ray Wend @@ -5380,23 +5380,17 @@ om) -** provides -** ** + high @@ -5453,18 +5453,16 @@ ials on -** %5BObjc.io @@ -5483,25 +5483,21 @@ objc.io) -** %0A%0A* %5B -** NSHipste @@ -5517,26 +5517,24 @@ ipster.com) -** is a journal @@ -5661,18 +5661,16 @@ pment. %5B -** NSScreen @@ -5708,18 +5708,16 @@ pisodes) -** %0A%0A* A st @@ -5753,18 +5753,16 @@ called -** %5BNatasha @@ -5805,18 +5805,16 @@ bot.com) -** %0A%0A* Crea @@ -5824,18 +5824,16 @@ useful . -** gitignor @@ -5833,18 +5833,16 @@ itignore -** files f @@ -5861,18 +5861,16 @@ ect on %5B -** gitignor @@ -5900,25 +5900,21 @@ nore.io) -** %0A%0A* %5B -** Pttrns%5D( @@ -5932,18 +5932,16 @@ ns.com) -** is a col @@ -6053,18 +6053,16 @@ ces on %5B -** iOSDev.t @@ -6092,17 +6092,13 @@ ols) -** %0A%0A* %5B -** Coco @@ -6139,18 +6139,16 @@ ols.com) -** provide @@ -6179,17 +6179,16 @@ mponents - %0Afor iOS @@ -6244,18 +6244,16 @@ cles on -** %5BNSHint%5D @@ -6270,18 +6270,16 @@ hint.io) -** %0A%0A* Grea @@ -6305,18 +6305,16 @@ nd co. %5B -** khanlou%5D @@ -6333,18 +6333,16 @@ lou.com) -** %0A%0A### Po @@ -6352,18 +6352,16 @@ sts%0A%0A* %5B -** Core Int @@ -6391,18 +6391,16 @@ int.org) -** is a po @@ -6489,18 +6489,16 @@ es.%0A%0A* %5B -** iPhreaks @@ -6528,18 +6528,16 @@ hreaks/) -** provide @@ -6643,18 +6643,16 @@ Podcast -** %5BThe Ray @@ -6715,18 +6715,16 @@ podcast) -** %0A%0AFeel f @@ -6741,18 +6741,16 @@ me on %5B -** github%5D( @@ -6787,15 +6787,11 @@ ldt) -** , %5B -** twit @@ -6900,15 +6900,11 @@ 61) -** or -** %5Bxin @@ -6964,18 +6964,16 @@ =mxb_p) -** if you h @@ -7057,18 +7057,16 @@ cks on %5B -** SoundClo @@ -7112,17 +7112,13 @@ ldt) -** ;)%0A%5B -** Seba @@ -7149,10 +7149,8 @@ ldt) -** %0A*Se
json metadata{"tags":["programming","ios","cocoa","swift"],"links":["https://get.fabric.io","https://developer.apple.com/testflight/","https://smooch.io","https://mixpanel.com","https://trello.com","https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiew4HR493LAhWsIpoKHRa1Dl4QFggpMAA&url=https%3A%2F%2Fde.atlassian.com%2Fsoftware%2Fjira&usg=AFQjCNG7Qw8fibiPjAvoxyU83uCs4lUEJQ&sig2=4VlRGoUgjj2bwQSc3jg0KQ","https://en.wikipedia.org/wiki/Scrum_%28software_development%29","https://www.atlassian.com/git/tutorials/comparing-workflows/","https://fastlane.tools","https://luckymarmot.com/de/paw","https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjS1KvAnMDMAhUBJMAKHXclCG8QFggdMAA&url=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Fpostman%2Ffhbjgbiflinjbdggehcddcbncdddomop&usg=AFQjCNEKwgqPDcgrMAsS6iZ8PUYhTzB58A&sig2=IBr-c8l-FnJjzwP0tBaAOA","https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html","https://github.com/realm/jazzy","https://www.sourcetreeapp.com","https://atom.io","http://alcatraz.io","https://simpholders.com","https://cocoapods.org","https://github.com/Carthage/Carthage","https://www.charlesproxy.com","https://github.com/facebook/chisel","http://www.paintcodeapp.com","https://icons8.com","http://www.pixelmator.com/mac/","https://tickplant.com/powerjsoneditor/","http://sipapp.io","https://getkap.co","https://getpocket.com","https://itunes.apple.com/de/app/ccmenu/id603117688?mt=12","https://github.com/vsouza/awesome-ios","http://AFNetworking","https://github.com/Alamofire/Alamofire","http://promisekit.org","https://github.com/SebastianBoldt/Jelly","http://audiokit.io","https://github.com/facebook/Tweaks","https://realm.io/docs/swift/latest/","https://github.com/mac-cain13/R.swift","https://github.com/conopsys/COSTouchVisualizer","https://github.com/realm/SwiftLint","https://github.com/SebastianBoldt/Terminal-Cheatsheet","https://www.raywenderlich.com","https://www.objc.io","http://nshipster.com","http://nsscreencast.com/episodes","https://www.natashatherobot.com","https://www.gitignore.io","http://pttrns.com","https://iosdev.tools","https://www.cocoacontrols.com","http://nshint.io","http://khanlou.com","http://www.coreint.org","https://devchat.tv/iphreaks/","https://www.raywenderlich.com/rwpodcast","https://github.com/SebastianBoldt","https://twitter.com/sebastianboldt","https://de.linkedin.com/in/sebastian-boldt-9b465261","https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p","https://soundcloud.com/sebastian_boldt"],"app":"steemit/0.1","format":"markdown","image":["https://cdn-images-1.medium.com/max/4000/1*i3SuhBo3VEC8G79ee1CQ5w.jpeg"]}
Transaction InfoBlock #17106717/Trx c7ca813a22f5475cac41331044ac1cb78ef97400
View Raw JSON Data
{
  "trx_id": "c7ca813a22f5475cac41331044ac1cb78ef97400",
  "block": 17106717,
  "trx_in_block": 10,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T18:28:30",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "programming",
      "author": "sebastianboldt",
      "permlink": "7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "title": "My iOS Development Toolkit 2017",
      "body": "@@ -134,230 +134,8 @@\n g)%0A%0A\n-### If you like the content I provide for free I would really appreciate if you could give this article an upvote on steemit. Thanks in advance . %5Bhttps://steemit.com/@sebastianboldt%5D(https://steemit.com/@sebastianboldt)%0A%0A\n This\n@@ -302,18 +302,16 @@\n called %5B\n-**\n Fabric%5D(\n@@ -332,25 +332,21 @@\n bric.io)\n-**\n %0A%0A* %5B\n-**\n Testflig\n@@ -386,26 +386,24 @@\n estflight/) \n-**\n is a native \n@@ -439,18 +439,16 @@\n ork%0A%0A* %5B\n-**\n Smooch%5D(\n@@ -466,18 +466,16 @@\n och.io) \n-**\n is a gre\n@@ -576,18 +576,16 @@\n s with %5B\n-**\n Mixpanel\n@@ -603,26 +603,24 @@\n ixpanel.com)\n-**\n %0A%0A* I use %5B*\n@@ -618,18 +618,16 @@\n  I use %5B\n-**\n Trello%5D(\n@@ -645,18 +645,16 @@\n llo.com)\n-**\n  to mana\n@@ -731,18 +731,16 @@\n l like %5B\n-**\n JIRA%5D(ht\n@@ -981,18 +981,17 @@\n 3jg0KQ) \n-**\n+ \n directly\n@@ -1020,21 +1020,17 @@\n pository\n-** **\n+ \n in conju\n@@ -1040,18 +1040,16 @@\n ion with\n-**\n  %5BSCRUM%5D\n@@ -1117,16 +1117,13 @@\n 29) \n-**\n and \n-**\n+ \n %5BGit\n@@ -1198,18 +1198,16 @@\n kflows/)\n-**\n %0A%0A### To\n@@ -1250,18 +1250,16 @@\n  using %5B\n-**\n Fastlane\n@@ -1285,18 +1285,16 @@\n tools). \n-**\n It autom\n@@ -1493,18 +1493,16 @@\n  I use %5B\n-**\n PAW%5D(htt\n@@ -1835,18 +1835,16 @@\n tBaAOA) \n-**\n for test\n@@ -1871,20 +1871,16 @@\n RESTful \n-****\n APIs%0A%0A* \n@@ -1918,18 +1918,16 @@\n  using %5B\n-**\n Instrume\n@@ -2047,25 +2047,21 @@\n ex.html)\n-**\n %0A%0A* %5B\n-**\n Jazzy%5D(h\n@@ -2090,18 +2090,16 @@\n m/jazzy)\n-**\n  is a co\n@@ -2195,26 +2195,18 @@\n ing \n-**\n GIT \n-**\n I can \n-****\n high\n@@ -2219,18 +2219,16 @@\n ommend %5B\n-**\n Source T\n@@ -2258,26 +2258,24 @@\n treeapp.com)\n-**\n %0A%0A* When wor\n@@ -2315,18 +2315,16 @@\n  using %5B\n-**\n Atom%5D(ht\n@@ -2338,18 +2338,16 @@\n tom.io) \n-**\n over *Xc\n@@ -2395,18 +2395,16 @@\n called %5B\n-**\n Alcatraz\n@@ -2420,26 +2420,24 @@\n alcatraz.io)\n-**\n %0A%0A* Access s\n@@ -2493,18 +2493,16 @@\n r with %5B\n-**\n SimPhold\n@@ -2530,25 +2530,21 @@\n ers.com)\n-**\n %0A%0A* %5B\n-**\n Cocoa Po\n@@ -2565,26 +2565,24 @@\n coapods.org)\n-**\n  is a depend\n@@ -2623,18 +2623,16 @@\n pps%0A%0A* %5B\n-**\n Carthage\n@@ -2671,27 +2671,21 @@\n rthage) \n-**\n is a\n-** **\n+ \n simple, \n@@ -2789,18 +2789,16 @@\n ce use %5B\n-**\n Charles%5D\n@@ -2823,26 +2823,24 @@\n esproxy.com)\n-**\n %0A%0A* Improve \n@@ -2899,18 +2899,16 @@\n called %5B\n-**\n Chisel%5D(\n@@ -2942,18 +2942,16 @@\n /chisel)\n-**\n %0A%0A* Turn\n@@ -2976,18 +2976,16 @@\n e with %5B\n-**\n Paint Co\n@@ -3016,25 +3016,21 @@\n app.com)\n-**\n %0A%0A* %5B\n-**\n Icons8 A\n@@ -3048,26 +3048,24 @@\n /icons8.com)\n-**\n  provides 23\n@@ -3114,18 +3114,16 @@\n ent%0A%0A* %5B\n-**\n Pixelmat\n@@ -3162,19 +3162,13 @@\n c/) \n-**\n is a\n-** **\n+ \n grea\n@@ -3216,18 +3216,16 @@\n  OS%0A%0A* %5B\n-**\n Power JS\n@@ -3274,18 +3274,16 @@\n editor/)\n-**\n  is a gr\n@@ -3338,18 +3338,16 @@\n %0A* With \n-**\n %5BSip%5D(ht\n@@ -3361,18 +3361,16 @@\n papp.io)\n-**\n  you can\n@@ -3413,18 +3413,16 @@\n rs.%0A%0A* %5B\n-**\n Kap%5D(htt\n@@ -3436,18 +3436,16 @@\n tkap.co)\n-**\n  is an o\n@@ -3507,18 +3507,16 @@\n  I use %5B\n-**\n Pocket%5D(\n@@ -3537,18 +3537,16 @@\n ket.com)\n-**\n  across \n@@ -3600,18 +3600,16 @@\n ad.%0A%0A* %5B\n-**\n CCMenu%5D(\n@@ -3665,18 +3665,16 @@\n 8?mt=12)\n-**\n  display\n@@ -3807,18 +3807,16 @@\n ies%0A%0A* %5B\n-**\n Awesome-\n@@ -3858,18 +3858,16 @@\n ome-ios)\n-**\n  is a cu\n@@ -3963,18 +3963,16 @@\n  using %5B\n-**\n AFNetwor\n@@ -3997,18 +3997,16 @@\n working)\n-**\n %0A%0A* Netw\n@@ -4038,18 +4038,16 @@\n  using %5B\n-**\n Alamofir\n@@ -4088,25 +4088,21 @@\n amofire)\n-**\n %0A%0A* %5B\n-**\n PromiseK\n@@ -4127,18 +4127,16 @@\n kit.org)\n-**\n  make as\n@@ -4191,18 +4191,16 @@\n ts.%0A%0A* %5B\n-**\n Jelly%5D(h\n@@ -4238,18 +4238,16 @@\n t/Jelly)\n-**\n  provide\n@@ -4317,18 +4317,16 @@\n ode%0A%0A* %5B\n-**\n AudioKit\n@@ -4346,18 +4346,16 @@\n okit.io)\n-**\n  is a po\n@@ -4416,18 +4416,16 @@\n ork%0A%0A* %5B\n-**\n FBTweaks\n@@ -4461,18 +4461,16 @@\n /Tweaks)\n-**\n  is a gr\n@@ -4547,21 +4547,15 @@\n Git \n-****\n called \n-**\n %5BGit\n@@ -4630,25 +4630,21 @@\n kflows/)\n-**\n %0A%0A* %5B\n-**\n Realm%5D(h\n@@ -4679,18 +4679,16 @@\n atest/) \n-**\n is a gre\n@@ -4812,18 +4812,16 @@\n  using %5B\n-**\n R.swift%5D\n@@ -4859,18 +4859,16 @@\n R.swift)\n-**\n %0A%0A* Visu\n@@ -4937,18 +4937,16 @@\n d with %5B\n-**\n COSTouch\n@@ -5004,25 +5004,21 @@\n ualizer)\n-**\n %0A%0A* %5B\n-**\n SwiftLin\n@@ -5055,18 +5055,16 @@\n iftLint)\n-**\n  is a to\n@@ -5176,18 +5176,16 @@\n ous%0A%0A* %5B\n-**\n Terminal\n@@ -5197,18 +5197,16 @@\n t-Sheet \n-**\n %5D(https:\n@@ -5329,18 +5329,16 @@\n tes%0A%0A* %5B\n-**\n Ray Wend\n@@ -5380,23 +5380,17 @@\n om) \n-**\n provides\n-** **\n+ \n high\n@@ -5453,18 +5453,16 @@\n ials on \n-**\n %5BObjc.io\n@@ -5483,25 +5483,21 @@\n objc.io)\n-**\n %0A%0A* %5B\n-**\n NSHipste\n@@ -5517,26 +5517,24 @@\n ipster.com) \n-**\n is a journal\n@@ -5661,18 +5661,16 @@\n pment. %5B\n-**\n NSScreen\n@@ -5708,18 +5708,16 @@\n pisodes)\n-**\n %0A%0A* A st\n@@ -5753,18 +5753,16 @@\n  called \n-**\n %5BNatasha\n@@ -5805,18 +5805,16 @@\n bot.com)\n-**\n %0A%0A* Crea\n@@ -5824,18 +5824,16 @@\n useful .\n-**\n gitignor\n@@ -5833,18 +5833,16 @@\n itignore\n-**\n  files f\n@@ -5861,18 +5861,16 @@\n ect on %5B\n-**\n gitignor\n@@ -5900,25 +5900,21 @@\n nore.io)\n-**\n %0A%0A* %5B\n-**\n Pttrns%5D(\n@@ -5932,18 +5932,16 @@\n ns.com) \n-**\n is a col\n@@ -6053,18 +6053,16 @@\n ces on %5B\n-**\n iOSDev.t\n@@ -6092,17 +6092,13 @@\n ols)\n-**\n %0A%0A* %5B\n-**\n Coco\n@@ -6139,18 +6139,16 @@\n ols.com)\n-**\n  provide\n@@ -6179,17 +6179,16 @@\n mponents\n- \n %0Afor iOS\n@@ -6244,18 +6244,16 @@\n cles on \n-**\n %5BNSHint%5D\n@@ -6270,18 +6270,16 @@\n hint.io)\n-**\n %0A%0A* Grea\n@@ -6305,18 +6305,16 @@\n nd co. %5B\n-**\n khanlou%5D\n@@ -6333,18 +6333,16 @@\n lou.com)\n-**\n %0A%0A### Po\n@@ -6352,18 +6352,16 @@\n sts%0A%0A* %5B\n-**\n Core Int\n@@ -6391,18 +6391,16 @@\n int.org)\n-**\n  is a po\n@@ -6489,18 +6489,16 @@\n es.%0A%0A* %5B\n-**\n iPhreaks\n@@ -6528,18 +6528,16 @@\n hreaks/)\n-**\n  provide\n@@ -6643,18 +6643,16 @@\n Podcast \n-**\n %5BThe Ray\n@@ -6715,18 +6715,16 @@\n podcast)\n-**\n %0A%0AFeel f\n@@ -6741,18 +6741,16 @@\n  me on %5B\n-**\n github%5D(\n@@ -6787,15 +6787,11 @@\n ldt)\n-**\n , %5B\n-**\n twit\n@@ -6900,15 +6900,11 @@\n 61) \n-**\n or \n-**\n %5Bxin\n@@ -6964,18 +6964,16 @@\n =mxb_p) \n-**\n if you h\n@@ -7057,18 +7057,16 @@\n cks on %5B\n-**\n SoundClo\n@@ -7112,17 +7112,13 @@\n ldt)\n-**\n  ;)%0A%5B\n-**\n Seba\n@@ -7149,10 +7149,8 @@\n ldt)\n-**\n %0A*Se\n",
      "json_metadata": "{\"tags\":[\"programming\",\"ios\",\"cocoa\",\"swift\"],\"links\":[\"https://get.fabric.io\",\"https://developer.apple.com/testflight/\",\"https://smooch.io\",\"https://mixpanel.com\",\"https://trello.com\",\"https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiew4HR493LAhWsIpoKHRa1Dl4QFggpMAA&url=https%3A%2F%2Fde.atlassian.com%2Fsoftware%2Fjira&usg=AFQjCNG7Qw8fibiPjAvoxyU83uCs4lUEJQ&sig2=4VlRGoUgjj2bwQSc3jg0KQ\",\"https://en.wikipedia.org/wiki/Scrum_%28software_development%29\",\"https://www.atlassian.com/git/tutorials/comparing-workflows/\",\"https://fastlane.tools\",\"https://luckymarmot.com/de/paw\",\"https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjS1KvAnMDMAhUBJMAKHXclCG8QFggdMAA&url=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Fpostman%2Ffhbjgbiflinjbdggehcddcbncdddomop&usg=AFQjCNEKwgqPDcgrMAsS6iZ8PUYhTzB58A&sig2=IBr-c8l-FnJjzwP0tBaAOA\",\"https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html\",\"https://github.com/realm/jazzy\",\"https://www.sourcetreeapp.com\",\"https://atom.io\",\"http://alcatraz.io\",\"https://simpholders.com\",\"https://cocoapods.org\",\"https://github.com/Carthage/Carthage\",\"https://www.charlesproxy.com\",\"https://github.com/facebook/chisel\",\"http://www.paintcodeapp.com\",\"https://icons8.com\",\"http://www.pixelmator.com/mac/\",\"https://tickplant.com/powerjsoneditor/\",\"http://sipapp.io\",\"https://getkap.co\",\"https://getpocket.com\",\"https://itunes.apple.com/de/app/ccmenu/id603117688?mt=12\",\"https://github.com/vsouza/awesome-ios\",\"http://AFNetworking\",\"https://github.com/Alamofire/Alamofire\",\"http://promisekit.org\",\"https://github.com/SebastianBoldt/Jelly\",\"http://audiokit.io\",\"https://github.com/facebook/Tweaks\",\"https://realm.io/docs/swift/latest/\",\"https://github.com/mac-cain13/R.swift\",\"https://github.com/conopsys/COSTouchVisualizer\",\"https://github.com/realm/SwiftLint\",\"https://github.com/SebastianBoldt/Terminal-Cheatsheet\",\"https://www.raywenderlich.com\",\"https://www.objc.io\",\"http://nshipster.com\",\"http://nsscreencast.com/episodes\",\"https://www.natashatherobot.com\",\"https://www.gitignore.io\",\"http://pttrns.com\",\"https://iosdev.tools\",\"https://www.cocoacontrols.com\",\"http://nshint.io\",\"http://khanlou.com\",\"http://www.coreint.org\",\"https://devchat.tv/iphreaks/\",\"https://www.raywenderlich.com/rwpodcast\",\"https://github.com/SebastianBoldt\",\"https://twitter.com/sebastianboldt\",\"https://de.linkedin.com/in/sebastian-boldt-9b465261\",\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\",\"https://soundcloud.com/sebastian_boldt\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"image\":[\"https://cdn-images-1.medium.com/max/4000/1*i3SuhBo3VEC8G79ee1CQ5w.jpeg\"]}"
    }
  ]
}
2017/11/10 18:26:06
votersqube
authorsebastianboldt
permlink7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
weight100 (1.00%)
Transaction InfoBlock #17106669/Trx 1df3097d693d60e897c9a74211e5dd6957ec4190
View Raw JSON Data
{
  "trx_id": "1df3097d693d60e897c9a74211e5dd6957ec4190",
  "block": 17106669,
  "trx_in_block": 12,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T18:26:06",
  "op": [
    "vote",
    {
      "voter": "sqube",
      "author": "sebastianboldt",
      "permlink": "7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "weight": 100
    }
  ]
}
2017/11/10 18:25:06
parent author
parent permlinkprogramming
authorsebastianboldt
permlink7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
titleMy iOS Development Toolkit 2017
body@@ -1,26 +1,4 @@ -%3Chtml%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E ## M @@ -27,24 +27,18 @@ kit 2017 -%3C/p%3E%0A%3Cp%3E +%0A%0A Last Upd @@ -51,36 +51,18 @@ .02.2017 -%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E +%0A%0A !%5B%5D(http @@ -128,36 +128,242 @@ 5w.jpeg) -%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E +%0A%0A### If you like the content I provide for free I would really appreciate if you could give this article an upvote on steemit. Thanks in advance %F0%9F%98%9C. %5Bhttps://steemit.com/@sebastianboldt%5D(https://steemit.com/@sebastianboldt)%0A%0A This is @@ -458,24 +458,18 @@ y using. -%3C/p%3E%0A%3Cp%3E +%0A%0A ### Serv @@ -472,24 +472,18 @@ Services -%3C/p%3E%0A%3Cp%3E +%0A%0A * A modu @@ -556,32 +556,26 @@ fabric.io)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Testfli @@ -662,32 +662,26 @@ on framework -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Smooch%5D @@ -785,24 +785,18 @@ y users. -%3C/p%3E%0A%3Cp%3E +%0A%0A * Mobile @@ -847,24 +847,18 @@ l.com)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * I use @@ -919,24 +919,18 @@ projects -%3C/p%3E%0A%3Cp%3E +%0A%0A * When w @@ -1018,40 +1018,24 @@ a=t& -amp; rct=j& -amp;q=&amp; +q=& esrc=s& -amp; sour @@ -1045,44 +1045,28 @@ web& -amp; cd=1& -amp; cad=rja& -amp; uact=8& -amp; ved= @@ -1102,28 +1102,24 @@ Dl4QFggpMAA& -amp; url=https%253A @@ -1159,20 +1159,16 @@ %252Fjira& -amp; usg=AFQj @@ -1198,20 +1198,16 @@ s4lUEJQ& -amp; sig2=4Vl @@ -1456,36 +1456,18 @@ lows/)** -%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E +%0A%0A ### Tool @@ -1467,24 +1467,18 @@ ## Tools -%3C/p%3E%0A%3Cp%3E +%0A%0A * Contin @@ -1744,24 +1744,18 @@ e tools. -%3C/p%3E%0A%3Cp%3E +%0A%0A * I use @@ -1842,40 +1842,24 @@ a=t& -amp; rct=j& -amp;q=&amp; +q=& esrc=s& -amp; sour @@ -1869,44 +1869,28 @@ web& -amp; cd=1& -amp; cad=rja& -amp; uact=8& -amp; ved= @@ -1930,20 +1930,16 @@ FggdMAA& -amp; url=http @@ -2031,20 +2031,16 @@ dddomop& -amp; usg=AFQj @@ -2070,20 +2070,16 @@ hTzB58A& -amp; sig2=IBr @@ -2145,24 +2145,18 @@ ****APIs -%3C/p%3E%0A%3Cp%3E +%0A%0A * Find m @@ -2321,24 +2321,18 @@ .html)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Jaz @@ -2448,24 +2448,18 @@ ective-C -%3C/p%3E%0A%3Cp%3E +%0A%0A * If you @@ -2552,24 +2552,18 @@ p.com)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * When w @@ -2644,24 +2644,18 @@ *Xcode* -%3C/p%3E%0A%3Cp%3E +%0A%0A * A grea @@ -2722,24 +2722,18 @@ az.io)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * Access @@ -2828,32 +2828,26 @@ lders.com)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Cocoa P @@ -2924,24 +2924,18 @@ OS* Apps -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Car @@ -3040,24 +3040,18 @@ or Cocoa -%3C/p%3E%0A%3Cp%3E +%0A%0A * If you @@ -3145,24 +3145,18 @@ y.com)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * Improv @@ -3264,24 +3264,18 @@ hisel)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * Turn d @@ -3342,24 +3342,18 @@ p.com)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Ico @@ -3439,24 +3439,18 @@ p client -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Pix @@ -3549,24 +3549,18 @@ r Mac OS -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Pow @@ -3671,24 +3671,18 @@ N* Files -%3C/p%3E%0A%3Cp%3E +%0A%0A * With * @@ -3735,20 +3735,16 @@ ganize & -amp; share y @@ -3754,24 +3754,18 @@ colors. -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Kap @@ -3846,24 +3846,18 @@ chnology -%3C/p%3E%0A%3Cp%3E +%0A%0A * I use @@ -3949,24 +3949,18 @@ er read. -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**CCM @@ -4130,36 +4130,18 @@ enu bar. -%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E +%0A%0A ### Fram @@ -4160,24 +4160,18 @@ ibraries -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Awe @@ -4278,24 +4278,18 @@ ategory. -%3C/p%3E%0A%3Cp%3E +%0A%0A * Networ @@ -4363,24 +4363,18 @@ rking)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * Networ @@ -4458,24 +4458,18 @@ ofire)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Pro @@ -4560,24 +4560,18 @@ objects. -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Jel @@ -4690,24 +4690,18 @@ of code -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Aud @@ -4793,24 +4793,18 @@ ramework -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**FBT @@ -4898,24 +4898,18 @@ Runtime -%3C/p%3E%0A%3Cp%3E +%0A%0A * Branch @@ -5024,24 +5024,18 @@ lows/)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Rea @@ -5109,24 +5109,18 @@ ernative -%3C/p%3E%0A%3Cp%3E +%0A%0A * Get st @@ -5261,24 +5261,18 @@ swift)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * Visual @@ -5410,24 +5410,18 @@ lizer)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Swi @@ -5562,36 +5562,18 @@ de Xcode -%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E +%0A%0A ### Misc @@ -5581,24 +5581,18 @@ llaneous -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Ter @@ -5714,36 +5714,18 @@ Terminal -%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E +%0A%0A ### Blog @@ -5738,24 +5738,18 @@ Websites -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Ray @@ -5841,24 +5841,18 @@ utorials -%3C/p%3E%0A%3Cp%3E +%0A%0A * Books, @@ -5905,32 +5905,26 @@ w.objc.io)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**NSHipst @@ -6036,24 +6036,18 @@ weekly. -%3C/p%3E%0A%3Cp%3E +%0A%0A * Weekly @@ -6142,24 +6142,18 @@ sodes)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * A stat @@ -6243,24 +6243,18 @@ t.com)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * Create @@ -6346,24 +6346,18 @@ re.io)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Ptt @@ -6444,24 +6444,18 @@ iration. -%3C/p%3E%0A%3Cp%3E +%0A%0A * You ca @@ -6492,12 +6492,8 @@ ls & -amp; Res @@ -6542,24 +6542,18 @@ tools)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Coc @@ -6641,22 +6641,10 @@ ents -&nbsp;%3C/p%3E%0A%3Cp%3E + %0A for @@ -6656,24 +6656,18 @@ nd OS X. -%3C/p%3E%0A%3Cp%3E +%0A%0A * You ca @@ -6733,24 +6733,18 @@ nt.io)** -%3C/p%3E%0A%3Cp%3E +%0A%0A * Great @@ -6800,36 +6800,18 @@ u.com)** -%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E +%0A%0A ### Podc @@ -6814,24 +6814,18 @@ Podcasts -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**Cor @@ -6955,24 +6955,18 @@ ologies. -%3C/p%3E%0A%3Cp%3E +%0A%0A * %5B**iPh @@ -7084,24 +7084,18 @@ for iOS. -%3C/p%3E%0A%3Cp%3E +%0A%0A * Great @@ -7198,28 +7198,10 @@ t)** -%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E +%0A%0A Feel @@ -7606,24 +7606,17 @@ dt)** ;) -%3C/p%3E%0A%3Cp%3E +%0A %5B**Sebas @@ -7644,24 +7644,17 @@ Boldt)** -%3C/p%3E%0A%3Cp%3E +%0A *Sebasti @@ -7770,64 +7770,28 @@ ldt) -%3C/p%3E%0A%3Cp%3ECiao!%3C/p%3E%0A%3Cp%3ESebastian Boldt%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3C/html%3E +%0A%0ACiao!%0A%0ASebastian Boldt
json metadata{"tags":["programming","ios","cocoa","swift"],"links":["https://steemit.com/@sebastianboldt","https://get.fabric.io","https://developer.apple.com/testflight/","https://smooch.io","https://mixpanel.com","https://trello.com","https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiew4HR493LAhWsIpoKHRa1Dl4QFggpMAA&url=https%3A%2F%2Fde.atlassian.com%2Fsoftware%2Fjira&usg=AFQjCNG7Qw8fibiPjAvoxyU83uCs4lUEJQ&sig2=4VlRGoUgjj2bwQSc3jg0KQ","https://en.wikipedia.org/wiki/Scrum_%28software_development%29","https://www.atlassian.com/git/tutorials/comparing-workflows/","https://fastlane.tools","https://luckymarmot.com/de/paw","https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjS1KvAnMDMAhUBJMAKHXclCG8QFggdMAA&url=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Fpostman%2Ffhbjgbiflinjbdggehcddcbncdddomop&usg=AFQjCNEKwgqPDcgrMAsS6iZ8PUYhTzB58A&sig2=IBr-c8l-FnJjzwP0tBaAOA","https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html","https://github.com/realm/jazzy","https://www.sourcetreeapp.com","https://atom.io","http://alcatraz.io","https://simpholders.com","https://cocoapods.org","https://github.com/Carthage/Carthage","https://www.charlesproxy.com","https://github.com/facebook/chisel","http://www.paintcodeapp.com","https://icons8.com","http://www.pixelmator.com/mac/","https://tickplant.com/powerjsoneditor/","http://sipapp.io","https://getkap.co","https://getpocket.com","https://itunes.apple.com/de/app/ccmenu/id603117688?mt=12","https://github.com/vsouza/awesome-ios","http://AFNetworking","https://github.com/Alamofire/Alamofire","http://promisekit.org","https://github.com/SebastianBoldt/Jelly","http://audiokit.io","https://github.com/facebook/Tweaks","https://realm.io/docs/swift/latest/","https://github.com/mac-cain13/R.swift","https://github.com/conopsys/COSTouchVisualizer","https://github.com/realm/SwiftLint","https://github.com/SebastianBoldt/Terminal-Cheatsheet","https://www.raywenderlich.com","https://www.objc.io","http://nshipster.com","http://nsscreencast.com/episodes","https://www.natashatherobot.com","https://www.gitignore.io","http://pttrns.com","https://iosdev.tools","https://www.cocoacontrols.com","http://nshint.io","http://khanlou.com","http://www.coreint.org","https://devchat.tv/iphreaks/","https://www.raywenderlich.com/rwpodcast","https://github.com/SebastianBoldt","https://twitter.com/sebastianboldt","https://de.linkedin.com/in/sebastian-boldt-9b465261","https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p","https://soundcloud.com/sebastian_boldt"],"app":"steemit/0.1","format":"markdown","image":["https://cdn-images-1.medium.com/max/4000/1*i3SuhBo3VEC8G79ee1CQ5w.jpeg"]}
Transaction InfoBlock #17106649/Trx 05e8650bcabe5911ab05bad7bbbd5ebe859a3024
View Raw JSON Data
{
  "trx_id": "05e8650bcabe5911ab05bad7bbbd5ebe859a3024",
  "block": 17106649,
  "trx_in_block": 19,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T18:25:06",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "programming",
      "author": "sebastianboldt",
      "permlink": "7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "title": "My iOS Development Toolkit 2017",
      "body": "@@ -1,26 +1,4 @@\n-%3Chtml%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E\n ## M\n@@ -27,24 +27,18 @@\n kit 2017\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n Last Upd\n@@ -51,36 +51,18 @@\n .02.2017\n-%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n !%5B%5D(http\n@@ -128,36 +128,242 @@\n 5w.jpeg)\n-%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E\n+%0A%0A### If you like the content I provide for free I would really appreciate if you could give this article an upvote on steemit. Thanks in advance %F0%9F%98%9C. %5Bhttps://steemit.com/@sebastianboldt%5D(https://steemit.com/@sebastianboldt)%0A%0A\n This is \n@@ -458,24 +458,18 @@\n y using.\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n ### Serv\n@@ -472,24 +472,18 @@\n Services\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * A modu\n@@ -556,32 +556,26 @@\n fabric.io)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Testfli\n@@ -662,32 +662,26 @@\n on framework\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Smooch%5D\n@@ -785,24 +785,18 @@\n y users.\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * Mobile\n@@ -847,24 +847,18 @@\n l.com)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * I use \n@@ -919,24 +919,18 @@\n projects\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * When w\n@@ -1018,40 +1018,24 @@\n a=t&\n-amp;\n rct=j&\n-amp;q=&amp;\n+q=&\n esrc=s&\n-amp;\n sour\n@@ -1045,44 +1045,28 @@\n web&\n-amp;\n cd=1&\n-amp;\n cad=rja&\n-amp;\n uact=8&\n-amp;\n ved=\n@@ -1102,28 +1102,24 @@\n Dl4QFggpMAA&\n-amp;\n url=https%253A\n@@ -1159,20 +1159,16 @@\n %252Fjira&\n-amp;\n usg=AFQj\n@@ -1198,20 +1198,16 @@\n s4lUEJQ&\n-amp;\n sig2=4Vl\n@@ -1456,36 +1456,18 @@\n lows/)**\n-%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n ### Tool\n@@ -1467,24 +1467,18 @@\n ## Tools\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * Contin\n@@ -1744,24 +1744,18 @@\n e tools.\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * I use \n@@ -1842,40 +1842,24 @@\n a=t&\n-amp;\n rct=j&\n-amp;q=&amp;\n+q=&\n esrc=s&\n-amp;\n sour\n@@ -1869,44 +1869,28 @@\n web&\n-amp;\n cd=1&\n-amp;\n cad=rja&\n-amp;\n uact=8&\n-amp;\n ved=\n@@ -1930,20 +1930,16 @@\n FggdMAA&\n-amp;\n url=http\n@@ -2031,20 +2031,16 @@\n dddomop&\n-amp;\n usg=AFQj\n@@ -2070,20 +2070,16 @@\n hTzB58A&\n-amp;\n sig2=IBr\n@@ -2145,24 +2145,18 @@\n ****APIs\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * Find m\n@@ -2321,24 +2321,18 @@\n .html)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Jaz\n@@ -2448,24 +2448,18 @@\n ective-C\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * If you\n@@ -2552,24 +2552,18 @@\n p.com)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * When w\n@@ -2644,24 +2644,18 @@\n  *Xcode*\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * A grea\n@@ -2722,24 +2722,18 @@\n az.io)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * Access\n@@ -2828,32 +2828,26 @@\n lders.com)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Cocoa P\n@@ -2924,24 +2924,18 @@\n OS* Apps\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Car\n@@ -3040,24 +3040,18 @@\n or Cocoa\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * If you\n@@ -3145,24 +3145,18 @@\n y.com)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * Improv\n@@ -3264,24 +3264,18 @@\n hisel)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * Turn d\n@@ -3342,24 +3342,18 @@\n p.com)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Ico\n@@ -3439,24 +3439,18 @@\n p client\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Pix\n@@ -3549,24 +3549,18 @@\n r Mac OS\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Pow\n@@ -3671,24 +3671,18 @@\n N* Files\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * With *\n@@ -3735,20 +3735,16 @@\n ganize &\n-amp;\n  share y\n@@ -3754,24 +3754,18 @@\n  colors.\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Kap\n@@ -3846,24 +3846,18 @@\n chnology\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * I use \n@@ -3949,24 +3949,18 @@\n er read.\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**CCM\n@@ -4130,36 +4130,18 @@\n enu bar.\n-%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n ### Fram\n@@ -4160,24 +4160,18 @@\n ibraries\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Awe\n@@ -4278,24 +4278,18 @@\n ategory.\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * Networ\n@@ -4363,24 +4363,18 @@\n rking)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * Networ\n@@ -4458,24 +4458,18 @@\n ofire)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Pro\n@@ -4560,24 +4560,18 @@\n objects.\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Jel\n@@ -4690,24 +4690,18 @@\n  of code\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Aud\n@@ -4793,24 +4793,18 @@\n ramework\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**FBT\n@@ -4898,24 +4898,18 @@\n  Runtime\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * Branch\n@@ -5024,24 +5024,18 @@\n lows/)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Rea\n@@ -5109,24 +5109,18 @@\n ernative\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * Get st\n@@ -5261,24 +5261,18 @@\n swift)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * Visual\n@@ -5410,24 +5410,18 @@\n lizer)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Swi\n@@ -5562,36 +5562,18 @@\n de Xcode\n-%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n ### Misc\n@@ -5581,24 +5581,18 @@\n llaneous\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Ter\n@@ -5714,36 +5714,18 @@\n Terminal\n-%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n ### Blog\n@@ -5738,24 +5738,18 @@\n Websites\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Ray\n@@ -5841,24 +5841,18 @@\n utorials\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * Books,\n@@ -5905,32 +5905,26 @@\n w.objc.io)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**NSHipst\n@@ -6036,24 +6036,18 @@\n  weekly.\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * Weekly\n@@ -6142,24 +6142,18 @@\n sodes)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * A stat\n@@ -6243,24 +6243,18 @@\n t.com)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * Create\n@@ -6346,24 +6346,18 @@\n re.io)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Ptt\n@@ -6444,24 +6444,18 @@\n iration.\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * You ca\n@@ -6492,12 +6492,8 @@\n ls &\n-amp;\n  Res\n@@ -6542,24 +6542,18 @@\n tools)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Coc\n@@ -6641,22 +6641,10 @@\n ents\n-&nbsp;%3C/p%3E%0A%3Cp%3E\n+ %0A\n for \n@@ -6656,24 +6656,18 @@\n nd OS X.\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * You ca\n@@ -6733,24 +6733,18 @@\n nt.io)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * Great \n@@ -6800,36 +6800,18 @@\n u.com)**\n-%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n ### Podc\n@@ -6814,24 +6814,18 @@\n Podcasts\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**Cor\n@@ -6955,24 +6955,18 @@\n ologies.\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * %5B**iPh\n@@ -7084,24 +7084,18 @@\n for iOS.\n-%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n * Great \n@@ -7198,28 +7198,10 @@\n t)**\n-%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3Cp%3E\n+%0A%0A\n Feel\n@@ -7606,24 +7606,17 @@\n dt)** ;)\n-%3C/p%3E%0A%3Cp%3E\n+%0A\n %5B**Sebas\n@@ -7644,24 +7644,17 @@\n Boldt)**\n-%3C/p%3E%0A%3Cp%3E\n+%0A\n *Sebasti\n@@ -7770,64 +7770,28 @@\n ldt)\n-%3C/p%3E%0A%3Cp%3ECiao!%3C/p%3E%0A%3Cp%3ESebastian Boldt%3C/p%3E%0A%3Cp%3E%3Cbr%3E%3C/p%3E%0A%3C/html%3E\n+%0A%0ACiao!%0A%0ASebastian Boldt\n",
      "json_metadata": "{\"tags\":[\"programming\",\"ios\",\"cocoa\",\"swift\"],\"links\":[\"https://steemit.com/@sebastianboldt\",\"https://get.fabric.io\",\"https://developer.apple.com/testflight/\",\"https://smooch.io\",\"https://mixpanel.com\",\"https://trello.com\",\"https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiew4HR493LAhWsIpoKHRa1Dl4QFggpMAA&url=https%3A%2F%2Fde.atlassian.com%2Fsoftware%2Fjira&usg=AFQjCNG7Qw8fibiPjAvoxyU83uCs4lUEJQ&sig2=4VlRGoUgjj2bwQSc3jg0KQ\",\"https://en.wikipedia.org/wiki/Scrum_%28software_development%29\",\"https://www.atlassian.com/git/tutorials/comparing-workflows/\",\"https://fastlane.tools\",\"https://luckymarmot.com/de/paw\",\"https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjS1KvAnMDMAhUBJMAKHXclCG8QFggdMAA&url=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Fpostman%2Ffhbjgbiflinjbdggehcddcbncdddomop&usg=AFQjCNEKwgqPDcgrMAsS6iZ8PUYhTzB58A&sig2=IBr-c8l-FnJjzwP0tBaAOA\",\"https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html\",\"https://github.com/realm/jazzy\",\"https://www.sourcetreeapp.com\",\"https://atom.io\",\"http://alcatraz.io\",\"https://simpholders.com\",\"https://cocoapods.org\",\"https://github.com/Carthage/Carthage\",\"https://www.charlesproxy.com\",\"https://github.com/facebook/chisel\",\"http://www.paintcodeapp.com\",\"https://icons8.com\",\"http://www.pixelmator.com/mac/\",\"https://tickplant.com/powerjsoneditor/\",\"http://sipapp.io\",\"https://getkap.co\",\"https://getpocket.com\",\"https://itunes.apple.com/de/app/ccmenu/id603117688?mt=12\",\"https://github.com/vsouza/awesome-ios\",\"http://AFNetworking\",\"https://github.com/Alamofire/Alamofire\",\"http://promisekit.org\",\"https://github.com/SebastianBoldt/Jelly\",\"http://audiokit.io\",\"https://github.com/facebook/Tweaks\",\"https://realm.io/docs/swift/latest/\",\"https://github.com/mac-cain13/R.swift\",\"https://github.com/conopsys/COSTouchVisualizer\",\"https://github.com/realm/SwiftLint\",\"https://github.com/SebastianBoldt/Terminal-Cheatsheet\",\"https://www.raywenderlich.com\",\"https://www.objc.io\",\"http://nshipster.com\",\"http://nsscreencast.com/episodes\",\"https://www.natashatherobot.com\",\"https://www.gitignore.io\",\"http://pttrns.com\",\"https://iosdev.tools\",\"https://www.cocoacontrols.com\",\"http://nshint.io\",\"http://khanlou.com\",\"http://www.coreint.org\",\"https://devchat.tv/iphreaks/\",\"https://www.raywenderlich.com/rwpodcast\",\"https://github.com/SebastianBoldt\",\"https://twitter.com/sebastianboldt\",\"https://de.linkedin.com/in/sebastian-boldt-9b465261\",\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\",\"https://soundcloud.com/sebastian_boldt\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\",\"image\":[\"https://cdn-images-1.medium.com/max/4000/1*i3SuhBo3VEC8G79ee1CQ5w.jpeg\"]}"
    }
  ]
}
2017/11/10 18:21:12
voterubg
authorsebastianboldt
permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
weight100 (1.00%)
Transaction InfoBlock #17106571/Trx 76362d80da833b4bb5bf1fd9ae59bc8efcac8e43
View Raw JSON Data
{
  "trx_id": "76362d80da833b4bb5bf1fd9ae59bc8efcac8e43",
  "block": 17106571,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T18:21:12",
  "op": [
    "vote",
    {
      "voter": "ubg",
      "author": "sebastianboldt",
      "permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "weight": 100
    }
  ]
}
2017/11/10 18:21:03
parent author
parent permlinkprogramming
authorsebastianboldt
permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
titleLearn & Master ⚔️ the Basics of RxSwift in 10 Minutes
body@@ -7,12 +7,18 @@ %0A%3Cp%3E -!%5B%5D( +%3Cimg src=%22 http @@ -86,16 +86,36 @@ .png -)%3C/p%3E%0A%3Cp +%22 width=%222000%22 height=%22600%22/ %3E%3Cbr @@ -1277,579 +1277,255 @@ in -%3Cem%3E%3Cstrong%3ERxSwift%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eis an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eor something that operates on or subscribes to events emitted by an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence.%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EArrays,%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EStrings or Dictionaries%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ewill be converted to%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequences%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ein%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3ERxSwift. You can create an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3E +RxSwift is an observable sequence or something that operates on or subscribes to events emitted by an observable sequence. Arrays, Strings or Dictionaries will be converted to observable sequences in RxSwift. You can create an observable sequence of a @@ -1554,30 +1554,16 @@ s to the -%3C/strong%3E%3C/em%3E %3Ca href @@ -1622,90 +1622,30 @@ ce%22%3E -%3Cem%3E%3Cstrong%3ESequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EProtocol%3C/strong%3E%3C/em%3E%3C/a%3E %3Cstrong%3E +Sequence Protocol%3C/a%3E from @@ -1672,34 +1672,17 @@ Library. -%3C/strong%3E %3Cstrong%3E + Let%E2%80%99s cr @@ -1714,25 +1714,16 @@ ences:%3C/ -strong%3E%3C/ p%3E%0A%3Cpre%3E @@ -1776,29 +1776,24 @@ lo Rx%22)%3Cbr%3E%0A -%3Cbr%3E%0A let fibonacc @@ -1837,29 +1837,24 @@ 3,5,8%5D)%3Cbr%3E%0A -%3Cbr%3E%0A let dictSequ @@ -2175,29 +2175,24 @@ lo Rx%22)%3Cbr%3E%0A -%3Cbr%3E%0A let subscrip @@ -2233,29 +2233,24 @@ vent in%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;print @@ -2261,32 +2261,42 @@ nt)%3Cbr%3E%0A -%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A +%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -2308,21 +2308,16 @@ T: %3Cbr%3E%0A -%3Cbr%3E%0A next(%22He @@ -2326,29 +2326,24 @@ o Rx%22) %3Cbr%3E%0A -%3Cbr%3E%0A completed%3C/s @@ -2365,28 +2365,16 @@ pre%3E%0A%3Cp%3E -%3Cem%3E%3Cstrong%3E Observab @@ -2398,333 +2398,99 @@ emit -%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ezero%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eor more events%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eover their lifetimes. In%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3ERxSwift%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ean%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EEvent%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eis just an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EEnumeration Type%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3E + zero or more events over their lifetimes. In RxSwift an Event is just an Enumeration Type with @@ -2508,30 +2508,16 @@ states: -%3C/strong%3E%3C/em%3E &nbsp;%3C/ @@ -3173,29 +3173,24 @@ %22,%22o%22%5D)%3Cbr%3E%0A -%3Cbr%3E%0A let subscrip @@ -3274,29 +3274,24 @@ ;&nbsp;%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3326,29 +3326,24 @@ value):%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3398,36 +3398,25 @@ (value)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp; + &nbsp;&nbsp; @@ -3451,29 +3451,24 @@ error):%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3523,29 +3523,24 @@ (error)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3575,29 +3575,24 @@ pleted:%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3675,32 +3675,42 @@ p;%7D%3Cbr%3E%0A -%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A +%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cem%3E%3Cstr @@ -3713,26 +3713,16 @@ %3Cstrong%3E -%3Cbr%3E%0A%3Cbr%3E%0A OUTPUT:%3C @@ -3725,21 +3725,16 @@ UT:%3Cbr%3E%0A -%3Cbr%3E%0A H e l l @@ -3740,21 +3740,16 @@ o %3Cbr%3E%0A -%3Cbr%3E%0A complete @@ -4347,29 +4347,24 @@ rrectly%3Cbr%3E%0A -%3Cbr%3E%0A let bag = Di @@ -4379,34 +4379,24 @@ ()%3Cbr%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A // Creating @@ -4444,29 +4444,24 @@ g value%3Cbr%3E%0A -%3Cbr%3E%0A let observab @@ -4498,31 +4498,16 @@ !%22)%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A // Creat @@ -4606,29 +4606,24 @@ Next:%7B %3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -4635,37 +4635,32 @@ p;print($0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E @@ -4655,26 +4655,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A // Addin @@ -4703,21 +4703,16 @@ Bag%3Cbr%3E%0A -%3Cbr%3E%0A subscrip @@ -6518,21 +6518,16 @@ g()%3Cbr%3E%0A -%3Cbr%3E%0A var publ @@ -6831,37 +6831,32 @@ xt(%22Hello%22)%3Cbr%3E%0A -%3Cbr%3E%0A publishSubject.o @@ -7385,37 +7385,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;print($0) @@ -7414,21 +7414,16 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D).addDi @@ -7455,34 +7455,24 @@ g%3E%3Cbr%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A %3C/strong%3E%3C/e @@ -7535,39 +7535,24 @@ 2 won't%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A publishSubje @@ -7570,29 +7570,24 @@ Hello%22)%3Cbr%3E%0A -%3Cbr%3E%0A publishSubje @@ -7614,36 +7614,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A // Sub2 @@ -7683,29 +7683,24 @@ d later%3Cbr%3E%0A -%3Cbr%3E%0A let subscrip @@ -7737,37 +7737,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;print(#li @@ -7776,35 +7776,15 @@ br%3E%0A -%3Cbr%3E%0A %7D)%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A publ @@ -9911,37 +9911,12 @@ the -%3Cstrong%3Emap%3C/strong%3E %3Cstrong%3E +map oper @@ -10011,25 +10011,16 @@ mitting. -%3C/strong%3E &nbsp;%3C/ @@ -10072,29 +10072,24 @@ lue in %3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;retur @@ -10101,29 +10101,24 @@ ue * 10%3Cbr%3E%0A -%3Cbr%3E%0A %7D.subscribe( @@ -10126,29 +10126,24 @@ nNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;print @@ -10151,33 +10151,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -10236,45 +10236,19 @@ %3Ch3%3E -%3Cem%3E%3Cstrong%3E4.2 FlatMap%3C/strong%3E%3C/em%3E +4.2 FlatMap %3C/h3 @@ -10606,29 +10606,24 @@ of(1,2)%3Cbr%3E%0A -%3Cbr%3E%0A let sequence @@ -10651,39 +10651,24 @@ of(1,2)%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A let sequence @@ -10720,21 +10720,16 @@ e2)%3Cbr%3E%0A -%3Cbr%3E%0A sequence @@ -10776,37 +10776,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -10817,33 +10817,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -11083,29 +11083,24 @@ alue in%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -11130,21 +11130,16 @@ lue%3Cbr%3E%0A -%3Cbr%3E%0A %7D.subscr @@ -11147,37 +11147,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -11188,33 +11188,51 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E%3Cstrong%3E OUTPUT: @@ -11244,16 +11244,25 @@ 10 15%3C/ +strong%3E%3C/ code%3E%3C/p @@ -11479,29 +11479,24 @@ tervals%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -11584,29 +11584,24 @@ uler:s)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -11659,37 +11659,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -11704,45 +11704,35 @@ br%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstr @@ -12232,37 +12232,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -12285,33 +12285,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -12596,37 +12596,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -12637,33 +12637,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -13213,37 +13213,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -13254,33 +13254,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -13520,37 +13520,32 @@ shSubject()%3Cbr%3E%0A -%3Cbr%3E%0A let publish2 = P @@ -13581,26 +13581,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A %3C/strong @@ -13651,37 +13651,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -13684,37 +13684,32 @@ p;print($0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E @@ -13700,34 +13700,24 @@ %7D)%3Cbr%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A publish1.onN @@ -13720,37 +13720,32 @@ .onNext(20)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onNext( @@ -13748,29 +13748,24 @@ ext(40)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onN @@ -13772,29 +13772,24 @@ ext(60)%3Cbr%3E%0A -%3Cbr%3E%0A publish2.onN @@ -13795,29 +13795,24 @@ Next(1)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onN @@ -13819,29 +13819,24 @@ ext(80)%3Cbr%3E%0A -%3Cbr%3E%0A publish2.onN @@ -13842,29 +13842,24 @@ Next(2)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onN @@ -13867,25 +13867,40 @@ xt(100)%3C -br%3E%0A%3Cbr%3E%0A +/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -14467,29 +14467,24 @@ ,3,4,5)%3Cbr%3E%0A -%3Cbr%3E%0A let b = Obse @@ -14519,26 +14519,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A Observab @@ -14569,29 +14569,24 @@ cribe %7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -14610,24 +14610,34 @@ br%3E%0A -%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A +%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstr @@ -15370,29 +15370,24 @@ Next: %7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -15455,21 +15455,16 @@ ion%3Cbr%3E%0A -%3Cbr%3E%0A *%7D).subs @@ -15474,37 +15474,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -15515,21 +15515,16 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D)%3C/code @@ -15562,52 +15562,14 @@ %0A%3Cp%3E -%3Ca href=%22https://goo.gl/b5YD8Kcontent_copy%22%3E +&nbsp; Oper @@ -16083,20 +16083,22 @@ RxSwift: -%3C/a%3E +&nbsp; &nbsp;%3C/ @@ -17740,29 +17740,24 @@ bject()%3Cbr%3E%0A -%3Cbr%3E%0A let publish2 @@ -17785,26 +17785,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A let conc @@ -17862,29 +17862,24 @@ ground)%3Cbr%3E%0A -%3Cbr%3E%0A Observable.o @@ -17899,29 +17899,24 @@ blish2)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -17990,29 +17990,24 @@ eduler)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -18058,29 +18058,24 @@ merge()%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -18147,29 +18147,24 @@ uler())%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -18226,29 +18226,24 @@ nNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -18263,21 +18263,16 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3C @@ -18275,26 +18275,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A publish1 @@ -18295,29 +18295,24 @@ ext(20)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onN @@ -18319,25 +18319,40 @@ ext(40)%3C -br%3E%0A%3Cbr%3E%0A +/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E
json metadata{"tags":["programming","rxswift","ios","swift"],"links":["https://developer.apple.com/reference/swift/sequence","https://github.com/SebastianBoldt/Learn-and-Master-RxSwift","http://rxmarbles.com/","https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8","https://goo.gl/b5YD8Kcontent_copy","https://github.com/SebastianBoldt","https://twitter.com/sebastianboldt","https://de.linkedin.com/in/sebastian-boldt-9b465261","https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p","https://soundcloud.com/sebastian_boldt","https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md","http://reactivex.io/documentation/operators.html"],"app":"steemit/0.1","format":"html","image":["https://cdn-images-1.medium.com/max/4000/1*iVjIzql9k7PpwEUdb0phwQ.png"]}
Transaction InfoBlock #17106568/Trx 578e5c961f83e635bb09921e11cbfaffd44c52b1
View Raw JSON Data
{
  "trx_id": "578e5c961f83e635bb09921e11cbfaffd44c52b1",
  "block": 17106568,
  "trx_in_block": 26,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T18:21:03",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "programming",
      "author": "sebastianboldt",
      "permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "title": "Learn & Master ⚔️ the Basics of RxSwift in 10 Minutes",
      "body": "@@ -7,12 +7,18 @@\n %0A%3Cp%3E\n-!%5B%5D(\n+%3Cimg src=%22\n http\n@@ -86,16 +86,36 @@\n .png\n-)%3C/p%3E%0A%3Cp\n+%22 width=%222000%22 height=%22600%22/\n %3E%3Cbr\n@@ -1277,579 +1277,255 @@\n  in \n-%3Cem%3E%3Cstrong%3ERxSwift%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eis an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eor something that operates on or subscribes to events emitted by an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence.%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EArrays,%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EStrings or Dictionaries%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ewill be converted to%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequences%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ein%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3ERxSwift. You can create an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3E\n+RxSwift is an observable sequence or something that operates on or subscribes to events emitted by an observable sequence. Arrays, Strings or Dictionaries will be converted to observable sequences in RxSwift. You can create an observable sequence \n of a\n@@ -1554,30 +1554,16 @@\n s to the\n-%3C/strong%3E%3C/em%3E\n  %3Ca href\n@@ -1622,90 +1622,30 @@\n ce%22%3E\n-%3Cem%3E%3Cstrong%3ESequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EProtocol%3C/strong%3E%3C/em%3E%3C/a%3E %3Cstrong%3E\n+Sequence Protocol%3C/a%3E \n from\n@@ -1672,34 +1672,17 @@\n Library.\n-%3C/strong%3E %3Cstrong%3E\n+ \n Let%E2%80%99s cr\n@@ -1714,25 +1714,16 @@\n ences:%3C/\n-strong%3E%3C/\n p%3E%0A%3Cpre%3E\n@@ -1776,29 +1776,24 @@\n lo Rx%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let fibonacc\n@@ -1837,29 +1837,24 @@\n 3,5,8%5D)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let dictSequ\n@@ -2175,29 +2175,24 @@\n lo Rx%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let subscrip\n@@ -2233,29 +2233,24 @@\n vent in%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;print\n@@ -2261,32 +2261,42 @@\n nt)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -2308,21 +2308,16 @@\n T: %3Cbr%3E%0A\n-%3Cbr%3E%0A\n next(%22He\n@@ -2326,29 +2326,24 @@\n o Rx%22) %3Cbr%3E%0A\n-%3Cbr%3E%0A\n completed%3C/s\n@@ -2365,28 +2365,16 @@\n pre%3E%0A%3Cp%3E\n-%3Cem%3E%3Cstrong%3E\n Observab\n@@ -2398,333 +2398,99 @@\n emit\n-%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ezero%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eor more events%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eover their lifetimes. In%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3ERxSwift%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ean%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EEvent%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eis just an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EEnumeration Type%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3E\n+ zero or more events over their lifetimes. In RxSwift an Event is just an Enumeration Type \n with\n@@ -2508,30 +2508,16 @@\n  states:\n-%3C/strong%3E%3C/em%3E\n &nbsp;%3C/\n@@ -3173,29 +3173,24 @@\n %22,%22o%22%5D)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let subscrip\n@@ -3274,29 +3274,24 @@\n ;&nbsp;%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3326,29 +3326,24 @@\n value):%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3398,36 +3398,25 @@\n (value)%3Cbr%3E%0A\n-%3Cbr%3E%0A &nbsp;\n+ \n &nbsp;&nbsp;\n@@ -3451,29 +3451,24 @@\n error):%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3523,29 +3523,24 @@\n (error)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3575,29 +3575,24 @@\n pleted:%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3675,32 +3675,42 @@\n p;%7D%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cem%3E%3Cstr\n@@ -3713,26 +3713,16 @@\n %3Cstrong%3E\n-%3Cbr%3E%0A%3Cbr%3E%0A\n OUTPUT:%3C\n@@ -3725,21 +3725,16 @@\n UT:%3Cbr%3E%0A\n-%3Cbr%3E%0A\n H e l l \n@@ -3740,21 +3740,16 @@\n  o %3Cbr%3E%0A\n-%3Cbr%3E%0A\n complete\n@@ -4347,29 +4347,24 @@\n rrectly%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let bag = Di\n@@ -4379,34 +4379,24 @@\n ()%3Cbr%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n // Creating \n@@ -4444,29 +4444,24 @@\n g value%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let observab\n@@ -4498,31 +4498,16 @@\n !%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n // Creat\n@@ -4606,29 +4606,24 @@\n Next:%7B %3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -4635,37 +4635,32 @@\n p;print($0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E\n@@ -4655,26 +4655,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n // Addin\n@@ -4703,21 +4703,16 @@\n Bag%3Cbr%3E%0A\n-%3Cbr%3E%0A\n subscrip\n@@ -6518,21 +6518,16 @@\n g()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n var publ\n@@ -6831,37 +6831,32 @@\n xt(%22Hello%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publishSubject.o\n@@ -7385,37 +7385,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;print($0)\n@@ -7414,21 +7414,16 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D).addDi\n@@ -7455,34 +7455,24 @@\n g%3E%3Cbr%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n %3C/strong%3E%3C/e\n@@ -7535,39 +7535,24 @@\n 2 won't%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n publishSubje\n@@ -7570,29 +7570,24 @@\n Hello%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publishSubje\n@@ -7614,36 +7614,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n // Sub2 \n@@ -7683,29 +7683,24 @@\n d later%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let subscrip\n@@ -7737,37 +7737,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;print(#li\n@@ -7776,35 +7776,15 @@\n br%3E%0A\n-%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n publ\n@@ -9911,37 +9911,12 @@\n the \n-%3Cstrong%3Emap%3C/strong%3E %3Cstrong%3E\n+map \n oper\n@@ -10011,25 +10011,16 @@\n mitting.\n-%3C/strong%3E\n &nbsp;%3C/\n@@ -10072,29 +10072,24 @@\n lue in %3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;retur\n@@ -10101,29 +10101,24 @@\n ue * 10%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D.subscribe(\n@@ -10126,29 +10126,24 @@\n nNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;print\n@@ -10151,33 +10151,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -10236,45 +10236,19 @@\n %3Ch3%3E\n-%3Cem%3E%3Cstrong%3E4.2 FlatMap%3C/strong%3E%3C/em%3E\n+4.2 FlatMap\n %3C/h3\n@@ -10606,29 +10606,24 @@\n of(1,2)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let sequence\n@@ -10651,39 +10651,24 @@\n of(1,2)%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n let sequence\n@@ -10720,21 +10720,16 @@\n e2)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n sequence\n@@ -10776,37 +10776,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -10817,33 +10817,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -11083,29 +11083,24 @@\n alue in%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -11130,21 +11130,16 @@\n lue%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D.subscr\n@@ -11147,37 +11147,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -11188,33 +11188,51 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E%3Cstrong%3E\n OUTPUT: \n@@ -11244,16 +11244,25 @@\n  10 15%3C/\n+strong%3E%3C/\n code%3E%3C/p\n@@ -11479,29 +11479,24 @@\n tervals%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -11584,29 +11584,24 @@\n uler:s)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -11659,37 +11659,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -11704,45 +11704,35 @@\n br%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstr\n@@ -12232,37 +12232,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -12285,33 +12285,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -12596,37 +12596,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -12637,33 +12637,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -13213,37 +13213,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -13254,33 +13254,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -13520,37 +13520,32 @@\n shSubject()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let publish2 = P\n@@ -13581,26 +13581,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n %3C/strong\n@@ -13651,37 +13651,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -13684,37 +13684,32 @@\n p;print($0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E\n@@ -13700,34 +13700,24 @@\n %7D)%3Cbr%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n publish1.onN\n@@ -13720,37 +13720,32 @@\n .onNext(20)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onNext(\n@@ -13748,29 +13748,24 @@\n ext(40)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onN\n@@ -13772,29 +13772,24 @@\n ext(60)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish2.onN\n@@ -13795,29 +13795,24 @@\n Next(1)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onN\n@@ -13819,29 +13819,24 @@\n ext(80)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish2.onN\n@@ -13842,29 +13842,24 @@\n Next(2)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onN\n@@ -13867,25 +13867,40 @@\n xt(100)%3C\n-br%3E%0A%3Cbr%3E%0A\n+/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -14467,29 +14467,24 @@\n ,3,4,5)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let b = Obse\n@@ -14519,26 +14519,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n Observab\n@@ -14569,29 +14569,24 @@\n cribe %7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -14610,24 +14610,34 @@\n br%3E%0A\n-%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstr\n@@ -15370,29 +15370,24 @@\n Next: %7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -15455,21 +15455,16 @@\n ion%3Cbr%3E%0A\n-%3Cbr%3E%0A\n *%7D).subs\n@@ -15474,37 +15474,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -15515,21 +15515,16 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D)%3C/code\n@@ -15562,52 +15562,14 @@\n %0A%3Cp%3E\n-%3Ca href=%22https://goo.gl/b5YD8Kcontent_copy%22%3E\n+&nbsp;\n Oper\n@@ -16083,20 +16083,22 @@\n RxSwift:\n-%3C/a%3E\n+&nbsp;\n &nbsp;%3C/\n@@ -17740,29 +17740,24 @@\n bject()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let publish2\n@@ -17785,26 +17785,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n let conc\n@@ -17862,29 +17862,24 @@\n ground)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n Observable.o\n@@ -17899,29 +17899,24 @@\n blish2)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -17990,29 +17990,24 @@\n eduler)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -18058,29 +18058,24 @@\n merge()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -18147,29 +18147,24 @@\n uler())%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -18226,29 +18226,24 @@\n nNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -18263,21 +18263,16 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3C\n@@ -18275,26 +18275,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n publish1\n@@ -18295,29 +18295,24 @@\n ext(20)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onN\n@@ -18319,25 +18319,40 @@\n ext(40)%3C\n-br%3E%0A%3Cbr%3E%0A\n+/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n",
      "json_metadata": "{\"tags\":[\"programming\",\"rxswift\",\"ios\",\"swift\"],\"links\":[\"https://developer.apple.com/reference/swift/sequence\",\"https://github.com/SebastianBoldt/Learn-and-Master-RxSwift\",\"http://rxmarbles.com/\",\"https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8\",\"https://goo.gl/b5YD8Kcontent_copy\",\"https://github.com/SebastianBoldt\",\"https://twitter.com/sebastianboldt\",\"https://de.linkedin.com/in/sebastian-boldt-9b465261\",\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\",\"https://soundcloud.com/sebastian_boldt\",\"https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md\",\"http://reactivex.io/documentation/operators.html\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://cdn-images-1.medium.com/max/4000/1*iVjIzql9k7PpwEUdb0phwQ.png\"]}"
    }
  ]
}
2017/11/10 18:21:00
parent author
parent permlinkprogramming
authorsebastianboldt
permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
titleLearn & Master ⚔️ the Basics of RxSwift in 10 Minutes
body@@ -7,12 +7,18 @@ %0A%3Cp%3E -!%5B%5D( +%3Cimg src=%22 http @@ -86,16 +86,36 @@ .png -)%3C/p%3E%0A%3Cp +%22 width=%222000%22 height=%22600%22/ %3E%3Cbr @@ -1277,579 +1277,255 @@ in -%3Cem%3E%3Cstrong%3ERxSwift%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eis an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eor something that operates on or subscribes to events emitted by an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence.%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EArrays,%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EStrings or Dictionaries%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ewill be converted to%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequences%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ein%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3ERxSwift. You can create an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3E +RxSwift is an observable sequence or something that operates on or subscribes to events emitted by an observable sequence. Arrays, Strings or Dictionaries will be converted to observable sequences in RxSwift. You can create an observable sequence of a @@ -1554,30 +1554,16 @@ s to the -%3C/strong%3E%3C/em%3E %3Ca href @@ -1622,90 +1622,30 @@ ce%22%3E -%3Cem%3E%3Cstrong%3ESequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EProtocol%3C/strong%3E%3C/em%3E%3C/a%3E %3Cstrong%3E +Sequence Protocol%3C/a%3E from @@ -1672,34 +1672,17 @@ Library. -%3C/strong%3E %3Cstrong%3E + Let%E2%80%99s cr @@ -1714,25 +1714,16 @@ ences:%3C/ -strong%3E%3C/ p%3E%0A%3Cpre%3E @@ -1776,29 +1776,24 @@ lo Rx%22)%3Cbr%3E%0A -%3Cbr%3E%0A let fibonacc @@ -1837,29 +1837,24 @@ 3,5,8%5D)%3Cbr%3E%0A -%3Cbr%3E%0A let dictSequ @@ -2175,29 +2175,24 @@ lo Rx%22)%3Cbr%3E%0A -%3Cbr%3E%0A let subscrip @@ -2233,29 +2233,24 @@ vent in%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;print @@ -2261,32 +2261,42 @@ nt)%3Cbr%3E%0A -%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A +%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -2308,21 +2308,16 @@ T: %3Cbr%3E%0A -%3Cbr%3E%0A next(%22He @@ -2326,29 +2326,24 @@ o Rx%22) %3Cbr%3E%0A -%3Cbr%3E%0A completed%3C/s @@ -2365,28 +2365,16 @@ pre%3E%0A%3Cp%3E -%3Cem%3E%3Cstrong%3E Observab @@ -2398,333 +2398,99 @@ emit -%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ezero%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eor more events%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eover their lifetimes. In%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3ERxSwift%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ean%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EEvent%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eis just an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EEnumeration Type%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3E + zero or more events over their lifetimes. In RxSwift an Event is just an Enumeration Type with @@ -2508,30 +2508,16 @@ states: -%3C/strong%3E%3C/em%3E &nbsp;%3C/ @@ -3173,29 +3173,24 @@ %22,%22o%22%5D)%3Cbr%3E%0A -%3Cbr%3E%0A let subscrip @@ -3274,29 +3274,24 @@ ;&nbsp;%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3326,29 +3326,24 @@ value):%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3398,36 +3398,25 @@ (value)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp; + &nbsp;&nbsp; @@ -3451,29 +3451,24 @@ error):%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3523,29 +3523,24 @@ (error)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3575,29 +3575,24 @@ pleted:%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3675,32 +3675,42 @@ p;%7D%3Cbr%3E%0A -%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A +%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cem%3E%3Cstr @@ -3713,26 +3713,16 @@ %3Cstrong%3E -%3Cbr%3E%0A%3Cbr%3E%0A OUTPUT:%3C @@ -3725,21 +3725,16 @@ UT:%3Cbr%3E%0A -%3Cbr%3E%0A H e l l @@ -3740,21 +3740,16 @@ o %3Cbr%3E%0A -%3Cbr%3E%0A complete @@ -4347,29 +4347,24 @@ rrectly%3Cbr%3E%0A -%3Cbr%3E%0A let bag = Di @@ -4379,34 +4379,24 @@ ()%3Cbr%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A // Creating @@ -4444,29 +4444,24 @@ g value%3Cbr%3E%0A -%3Cbr%3E%0A let observab @@ -4498,31 +4498,16 @@ !%22)%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A // Creat @@ -4606,29 +4606,24 @@ Next:%7B %3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -4635,37 +4635,32 @@ p;print($0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E @@ -4655,26 +4655,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A // Addin @@ -4703,21 +4703,16 @@ Bag%3Cbr%3E%0A -%3Cbr%3E%0A subscrip @@ -6518,21 +6518,16 @@ g()%3Cbr%3E%0A -%3Cbr%3E%0A var publ @@ -6831,37 +6831,32 @@ xt(%22Hello%22)%3Cbr%3E%0A -%3Cbr%3E%0A publishSubject.o @@ -7385,37 +7385,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;print($0) @@ -7414,21 +7414,16 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D).addDi @@ -7455,34 +7455,24 @@ g%3E%3Cbr%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A %3C/strong%3E%3C/e @@ -7535,39 +7535,24 @@ 2 won't%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A publishSubje @@ -7570,29 +7570,24 @@ Hello%22)%3Cbr%3E%0A -%3Cbr%3E%0A publishSubje @@ -7614,36 +7614,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A // Sub2 @@ -7683,29 +7683,24 @@ d later%3Cbr%3E%0A -%3Cbr%3E%0A let subscrip @@ -7737,37 +7737,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;print(#li @@ -7776,35 +7776,15 @@ br%3E%0A -%3Cbr%3E%0A %7D)%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A publ @@ -9911,37 +9911,12 @@ the -%3Cstrong%3Emap%3C/strong%3E %3Cstrong%3E +map oper @@ -10011,25 +10011,16 @@ mitting. -%3C/strong%3E &nbsp;%3C/ @@ -10072,29 +10072,24 @@ lue in %3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;retur @@ -10101,29 +10101,24 @@ ue * 10%3Cbr%3E%0A -%3Cbr%3E%0A %7D.subscribe( @@ -10126,29 +10126,24 @@ nNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;print @@ -10151,33 +10151,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -10236,45 +10236,19 @@ %3Ch3%3E -%3Cem%3E%3Cstrong%3E4.2 FlatMap%3C/strong%3E%3C/em%3E +4.2 FlatMap %3C/h3 @@ -10606,29 +10606,24 @@ of(1,2)%3Cbr%3E%0A -%3Cbr%3E%0A let sequence @@ -10651,39 +10651,24 @@ of(1,2)%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A let sequence @@ -10720,21 +10720,16 @@ e2)%3Cbr%3E%0A -%3Cbr%3E%0A sequence @@ -10776,37 +10776,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -10817,33 +10817,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -11083,29 +11083,24 @@ alue in%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -11130,21 +11130,16 @@ lue%3Cbr%3E%0A -%3Cbr%3E%0A %7D.subscr @@ -11147,37 +11147,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -11188,33 +11188,51 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E%3Cstrong%3E OUTPUT: @@ -11244,16 +11244,25 @@ 10 15%3C/ +strong%3E%3C/ code%3E%3C/p @@ -11479,29 +11479,24 @@ tervals%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -11584,29 +11584,24 @@ uler:s)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -11659,37 +11659,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -11704,45 +11704,35 @@ br%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstr @@ -12232,37 +12232,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -12285,33 +12285,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -12596,37 +12596,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -12637,33 +12637,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -13213,37 +13213,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -13254,33 +13254,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -13520,37 +13520,32 @@ shSubject()%3Cbr%3E%0A -%3Cbr%3E%0A let publish2 = P @@ -13581,26 +13581,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A %3C/strong @@ -13651,37 +13651,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -13684,37 +13684,32 @@ p;print($0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E @@ -13700,34 +13700,24 @@ %7D)%3Cbr%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A publish1.onN @@ -13720,37 +13720,32 @@ .onNext(20)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onNext( @@ -13748,29 +13748,24 @@ ext(40)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onN @@ -13772,29 +13772,24 @@ ext(60)%3Cbr%3E%0A -%3Cbr%3E%0A publish2.onN @@ -13795,29 +13795,24 @@ Next(1)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onN @@ -13819,29 +13819,24 @@ ext(80)%3Cbr%3E%0A -%3Cbr%3E%0A publish2.onN @@ -13842,29 +13842,24 @@ Next(2)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onN @@ -13867,25 +13867,40 @@ xt(100)%3C -br%3E%0A%3Cbr%3E%0A +/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -14467,29 +14467,24 @@ ,3,4,5)%3Cbr%3E%0A -%3Cbr%3E%0A let b = Obse @@ -14519,26 +14519,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A Observab @@ -14569,29 +14569,24 @@ cribe %7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -14610,24 +14610,34 @@ br%3E%0A -%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A +%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstr @@ -15370,29 +15370,24 @@ Next: %7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -15455,21 +15455,16 @@ ion%3Cbr%3E%0A -%3Cbr%3E%0A *%7D).subs @@ -15474,37 +15474,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -15515,21 +15515,16 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D)%3C/code @@ -15562,52 +15562,14 @@ %0A%3Cp%3E -%3Ca href=%22https://goo.gl/b5YD8Kcontent_copy%22%3E +&nbsp; Oper @@ -16083,20 +16083,22 @@ RxSwift: -%3C/a%3E +&nbsp; &nbsp;%3C/ @@ -17740,29 +17740,24 @@ bject()%3Cbr%3E%0A -%3Cbr%3E%0A let publish2 @@ -17785,26 +17785,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A let conc @@ -17862,29 +17862,24 @@ ground)%3Cbr%3E%0A -%3Cbr%3E%0A Observable.o @@ -17899,29 +17899,24 @@ blish2)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -17990,29 +17990,24 @@ eduler)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -18058,29 +18058,24 @@ merge()%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -18147,29 +18147,24 @@ uler())%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -18226,29 +18226,24 @@ nNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -18263,21 +18263,16 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3C @@ -18275,26 +18275,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A publish1 @@ -18295,29 +18295,24 @@ ext(20)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onN @@ -18319,25 +18319,40 @@ ext(40)%3C -br%3E%0A%3Cbr%3E%0A +/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E
json metadata{"tags":["programming","rxswift","ios","swift"],"links":["https://developer.apple.com/reference/swift/sequence","https://github.com/SebastianBoldt/Learn-and-Master-RxSwift","http://rxmarbles.com/","https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8","https://goo.gl/b5YD8Kcontent_copy","https://github.com/SebastianBoldt","https://twitter.com/sebastianboldt","https://de.linkedin.com/in/sebastian-boldt-9b465261","https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p","https://soundcloud.com/sebastian_boldt","https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md","http://reactivex.io/documentation/operators.html"],"app":"steemit/0.1","format":"html","image":["https://cdn-images-1.medium.com/max/4000/1*iVjIzql9k7PpwEUdb0phwQ.png"]}
Transaction InfoBlock #17106567/Trx fa72b19c8f9643ebaf9f8373d2316d736d20a222
View Raw JSON Data
{
  "trx_id": "fa72b19c8f9643ebaf9f8373d2316d736d20a222",
  "block": 17106567,
  "trx_in_block": 17,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T18:21:00",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "programming",
      "author": "sebastianboldt",
      "permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "title": "Learn & Master ⚔️ the Basics of RxSwift in 10 Minutes",
      "body": "@@ -7,12 +7,18 @@\n %0A%3Cp%3E\n-!%5B%5D(\n+%3Cimg src=%22\n http\n@@ -86,16 +86,36 @@\n .png\n-)%3C/p%3E%0A%3Cp\n+%22 width=%222000%22 height=%22600%22/\n %3E%3Cbr\n@@ -1277,579 +1277,255 @@\n  in \n-%3Cem%3E%3Cstrong%3ERxSwift%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eis an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eor something that operates on or subscribes to events emitted by an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence.%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EArrays,%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EStrings or Dictionaries%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ewill be converted to%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequences%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ein%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3ERxSwift. You can create an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3E\n+RxSwift is an observable sequence or something that operates on or subscribes to events emitted by an observable sequence. Arrays, Strings or Dictionaries will be converted to observable sequences in RxSwift. You can create an observable sequence \n of a\n@@ -1554,30 +1554,16 @@\n s to the\n-%3C/strong%3E%3C/em%3E\n  %3Ca href\n@@ -1622,90 +1622,30 @@\n ce%22%3E\n-%3Cem%3E%3Cstrong%3ESequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EProtocol%3C/strong%3E%3C/em%3E%3C/a%3E %3Cstrong%3E\n+Sequence Protocol%3C/a%3E \n from\n@@ -1672,34 +1672,17 @@\n Library.\n-%3C/strong%3E %3Cstrong%3E\n+ \n Let%E2%80%99s cr\n@@ -1714,25 +1714,16 @@\n ences:%3C/\n-strong%3E%3C/\n p%3E%0A%3Cpre%3E\n@@ -1776,29 +1776,24 @@\n lo Rx%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let fibonacc\n@@ -1837,29 +1837,24 @@\n 3,5,8%5D)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let dictSequ\n@@ -2175,29 +2175,24 @@\n lo Rx%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let subscrip\n@@ -2233,29 +2233,24 @@\n vent in%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;print\n@@ -2261,32 +2261,42 @@\n nt)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -2308,21 +2308,16 @@\n T: %3Cbr%3E%0A\n-%3Cbr%3E%0A\n next(%22He\n@@ -2326,29 +2326,24 @@\n o Rx%22) %3Cbr%3E%0A\n-%3Cbr%3E%0A\n completed%3C/s\n@@ -2365,28 +2365,16 @@\n pre%3E%0A%3Cp%3E\n-%3Cem%3E%3Cstrong%3E\n Observab\n@@ -2398,333 +2398,99 @@\n emit\n-%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ezero%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eor more events%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eover their lifetimes. In%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3ERxSwift%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ean%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EEvent%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eis just an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EEnumeration Type%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3E\n+ zero or more events over their lifetimes. In RxSwift an Event is just an Enumeration Type \n with\n@@ -2508,30 +2508,16 @@\n  states:\n-%3C/strong%3E%3C/em%3E\n &nbsp;%3C/\n@@ -3173,29 +3173,24 @@\n %22,%22o%22%5D)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let subscrip\n@@ -3274,29 +3274,24 @@\n ;&nbsp;%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3326,29 +3326,24 @@\n value):%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3398,36 +3398,25 @@\n (value)%3Cbr%3E%0A\n-%3Cbr%3E%0A &nbsp;\n+ \n &nbsp;&nbsp;\n@@ -3451,29 +3451,24 @@\n error):%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3523,29 +3523,24 @@\n (error)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3575,29 +3575,24 @@\n pleted:%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3675,32 +3675,42 @@\n p;%7D%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cem%3E%3Cstr\n@@ -3713,26 +3713,16 @@\n %3Cstrong%3E\n-%3Cbr%3E%0A%3Cbr%3E%0A\n OUTPUT:%3C\n@@ -3725,21 +3725,16 @@\n UT:%3Cbr%3E%0A\n-%3Cbr%3E%0A\n H e l l \n@@ -3740,21 +3740,16 @@\n  o %3Cbr%3E%0A\n-%3Cbr%3E%0A\n complete\n@@ -4347,29 +4347,24 @@\n rrectly%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let bag = Di\n@@ -4379,34 +4379,24 @@\n ()%3Cbr%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n // Creating \n@@ -4444,29 +4444,24 @@\n g value%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let observab\n@@ -4498,31 +4498,16 @@\n !%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n // Creat\n@@ -4606,29 +4606,24 @@\n Next:%7B %3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -4635,37 +4635,32 @@\n p;print($0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E\n@@ -4655,26 +4655,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n // Addin\n@@ -4703,21 +4703,16 @@\n Bag%3Cbr%3E%0A\n-%3Cbr%3E%0A\n subscrip\n@@ -6518,21 +6518,16 @@\n g()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n var publ\n@@ -6831,37 +6831,32 @@\n xt(%22Hello%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publishSubject.o\n@@ -7385,37 +7385,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;print($0)\n@@ -7414,21 +7414,16 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D).addDi\n@@ -7455,34 +7455,24 @@\n g%3E%3Cbr%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n %3C/strong%3E%3C/e\n@@ -7535,39 +7535,24 @@\n 2 won't%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n publishSubje\n@@ -7570,29 +7570,24 @@\n Hello%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publishSubje\n@@ -7614,36 +7614,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n // Sub2 \n@@ -7683,29 +7683,24 @@\n d later%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let subscrip\n@@ -7737,37 +7737,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;print(#li\n@@ -7776,35 +7776,15 @@\n br%3E%0A\n-%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n publ\n@@ -9911,37 +9911,12 @@\n the \n-%3Cstrong%3Emap%3C/strong%3E %3Cstrong%3E\n+map \n oper\n@@ -10011,25 +10011,16 @@\n mitting.\n-%3C/strong%3E\n &nbsp;%3C/\n@@ -10072,29 +10072,24 @@\n lue in %3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;retur\n@@ -10101,29 +10101,24 @@\n ue * 10%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D.subscribe(\n@@ -10126,29 +10126,24 @@\n nNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;print\n@@ -10151,33 +10151,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -10236,45 +10236,19 @@\n %3Ch3%3E\n-%3Cem%3E%3Cstrong%3E4.2 FlatMap%3C/strong%3E%3C/em%3E\n+4.2 FlatMap\n %3C/h3\n@@ -10606,29 +10606,24 @@\n of(1,2)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let sequence\n@@ -10651,39 +10651,24 @@\n of(1,2)%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n let sequence\n@@ -10720,21 +10720,16 @@\n e2)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n sequence\n@@ -10776,37 +10776,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -10817,33 +10817,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -11083,29 +11083,24 @@\n alue in%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -11130,21 +11130,16 @@\n lue%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D.subscr\n@@ -11147,37 +11147,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -11188,33 +11188,51 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E%3Cstrong%3E\n OUTPUT: \n@@ -11244,16 +11244,25 @@\n  10 15%3C/\n+strong%3E%3C/\n code%3E%3C/p\n@@ -11479,29 +11479,24 @@\n tervals%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -11584,29 +11584,24 @@\n uler:s)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -11659,37 +11659,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -11704,45 +11704,35 @@\n br%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstr\n@@ -12232,37 +12232,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -12285,33 +12285,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -12596,37 +12596,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -12637,33 +12637,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -13213,37 +13213,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -13254,33 +13254,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -13520,37 +13520,32 @@\n shSubject()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let publish2 = P\n@@ -13581,26 +13581,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n %3C/strong\n@@ -13651,37 +13651,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -13684,37 +13684,32 @@\n p;print($0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E\n@@ -13700,34 +13700,24 @@\n %7D)%3Cbr%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n publish1.onN\n@@ -13720,37 +13720,32 @@\n .onNext(20)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onNext(\n@@ -13748,29 +13748,24 @@\n ext(40)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onN\n@@ -13772,29 +13772,24 @@\n ext(60)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish2.onN\n@@ -13795,29 +13795,24 @@\n Next(1)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onN\n@@ -13819,29 +13819,24 @@\n ext(80)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish2.onN\n@@ -13842,29 +13842,24 @@\n Next(2)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onN\n@@ -13867,25 +13867,40 @@\n xt(100)%3C\n-br%3E%0A%3Cbr%3E%0A\n+/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -14467,29 +14467,24 @@\n ,3,4,5)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let b = Obse\n@@ -14519,26 +14519,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n Observab\n@@ -14569,29 +14569,24 @@\n cribe %7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -14610,24 +14610,34 @@\n br%3E%0A\n-%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstr\n@@ -15370,29 +15370,24 @@\n Next: %7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -15455,21 +15455,16 @@\n ion%3Cbr%3E%0A\n-%3Cbr%3E%0A\n *%7D).subs\n@@ -15474,37 +15474,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -15515,21 +15515,16 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D)%3C/code\n@@ -15562,52 +15562,14 @@\n %0A%3Cp%3E\n-%3Ca href=%22https://goo.gl/b5YD8Kcontent_copy%22%3E\n+&nbsp;\n Oper\n@@ -16083,20 +16083,22 @@\n RxSwift:\n-%3C/a%3E\n+&nbsp;\n &nbsp;%3C/\n@@ -17740,29 +17740,24 @@\n bject()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let publish2\n@@ -17785,26 +17785,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n let conc\n@@ -17862,29 +17862,24 @@\n ground)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n Observable.o\n@@ -17899,29 +17899,24 @@\n blish2)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -17990,29 +17990,24 @@\n eduler)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -18058,29 +18058,24 @@\n merge()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -18147,29 +18147,24 @@\n uler())%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -18226,29 +18226,24 @@\n nNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -18263,21 +18263,16 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3C\n@@ -18275,26 +18275,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n publish1\n@@ -18295,29 +18295,24 @@\n ext(20)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onN\n@@ -18319,25 +18319,40 @@\n ext(40)%3C\n-br%3E%0A%3Cbr%3E%0A\n+/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n",
      "json_metadata": "{\"tags\":[\"programming\",\"rxswift\",\"ios\",\"swift\"],\"links\":[\"https://developer.apple.com/reference/swift/sequence\",\"https://github.com/SebastianBoldt/Learn-and-Master-RxSwift\",\"http://rxmarbles.com/\",\"https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8\",\"https://goo.gl/b5YD8Kcontent_copy\",\"https://github.com/SebastianBoldt\",\"https://twitter.com/sebastianboldt\",\"https://de.linkedin.com/in/sebastian-boldt-9b465261\",\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\",\"https://soundcloud.com/sebastian_boldt\",\"https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md\",\"http://reactivex.io/documentation/operators.html\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://cdn-images-1.medium.com/max/4000/1*iVjIzql9k7PpwEUdb0phwQ.png\"]}"
    }
  ]
}
2017/11/10 18:20:03
parent author
parent permlinkprogramming
authorsebastianboldt
permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
titleLearn & Master ⚔️ the Basics of RxSwift in 10 Minutes
body@@ -7,12 +7,8 @@ %0A%3Cp%3E -!%5B%5D( http @@ -72,17 +72,16 @@ phwQ.png -) %3C/p%3E%0A%3Cp%3E @@ -1246,579 +1246,255 @@ in -%3Cem%3E%3Cstrong%3ERxSwift%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eis an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eor something that operates on or subscribes to events emitted by an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence.%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EArrays,%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EStrings or Dictionaries%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ewill be converted to%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequences%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ein%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3ERxSwift. You can create an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3E +RxSwift is an observable sequence or something that operates on or subscribes to events emitted by an observable sequence. Arrays, Strings or Dictionaries will be converted to observable sequences in RxSwift. You can create an observable sequence of a @@ -1523,30 +1523,16 @@ s to the -%3C/strong%3E%3C/em%3E %3Ca href @@ -1591,90 +1591,30 @@ ce%22%3E -%3Cem%3E%3Cstrong%3ESequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EProtocol%3C/strong%3E%3C/em%3E%3C/a%3E %3Cstrong%3E +Sequence Protocol%3C/a%3E from @@ -1641,34 +1641,17 @@ Library. -%3C/strong%3E %3Cstrong%3E + Let%E2%80%99s cr @@ -1683,25 +1683,16 @@ ences:%3C/ -strong%3E%3C/ p%3E%0A%3Cpre%3E @@ -1745,29 +1745,24 @@ lo Rx%22)%3Cbr%3E%0A -%3Cbr%3E%0A let fibonacc @@ -1806,29 +1806,24 @@ 3,5,8%5D)%3Cbr%3E%0A -%3Cbr%3E%0A let dictSequ @@ -2144,29 +2144,24 @@ lo Rx%22)%3Cbr%3E%0A -%3Cbr%3E%0A let subscrip @@ -2202,29 +2202,24 @@ vent in%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;print @@ -2230,32 +2230,42 @@ nt)%3Cbr%3E%0A -%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A +%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -2277,21 +2277,16 @@ T: %3Cbr%3E%0A -%3Cbr%3E%0A next(%22He @@ -2295,29 +2295,24 @@ o Rx%22) %3Cbr%3E%0A -%3Cbr%3E%0A completed%3C/s @@ -2334,28 +2334,16 @@ pre%3E%0A%3Cp%3E -%3Cem%3E%3Cstrong%3E Observab @@ -2367,333 +2367,99 @@ emit -%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ezero%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eor more events%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eover their lifetimes. In%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3ERxSwift%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ean%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EEvent%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eis just an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EEnumeration Type%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3E + zero or more events over their lifetimes. In RxSwift an Event is just an Enumeration Type with @@ -2477,30 +2477,16 @@ states: -%3C/strong%3E%3C/em%3E &nbsp;%3C/ @@ -3142,29 +3142,24 @@ %22,%22o%22%5D)%3Cbr%3E%0A -%3Cbr%3E%0A let subscrip @@ -3243,29 +3243,24 @@ ;&nbsp;%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3295,29 +3295,24 @@ value):%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3367,36 +3367,25 @@ (value)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp; + &nbsp;&nbsp; @@ -3420,29 +3420,24 @@ error):%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3492,29 +3492,24 @@ (error)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3544,29 +3544,24 @@ pleted:%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3644,32 +3644,42 @@ p;%7D%3Cbr%3E%0A -%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A +%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cem%3E%3Cstr @@ -3682,26 +3682,16 @@ %3Cstrong%3E -%3Cbr%3E%0A%3Cbr%3E%0A OUTPUT:%3C @@ -3694,21 +3694,16 @@ UT:%3Cbr%3E%0A -%3Cbr%3E%0A H e l l @@ -3709,21 +3709,16 @@ o %3Cbr%3E%0A -%3Cbr%3E%0A complete @@ -4316,29 +4316,24 @@ rrectly%3Cbr%3E%0A -%3Cbr%3E%0A let bag = Di @@ -4348,34 +4348,24 @@ ()%3Cbr%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A // Creating @@ -4413,29 +4413,24 @@ g value%3Cbr%3E%0A -%3Cbr%3E%0A let observab @@ -4467,31 +4467,16 @@ !%22)%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A // Creat @@ -4575,29 +4575,24 @@ Next:%7B %3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -4604,37 +4604,32 @@ p;print($0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E @@ -4624,26 +4624,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A // Addin @@ -4672,21 +4672,16 @@ Bag%3Cbr%3E%0A -%3Cbr%3E%0A subscrip @@ -6487,21 +6487,16 @@ g()%3Cbr%3E%0A -%3Cbr%3E%0A var publ @@ -6800,37 +6800,32 @@ xt(%22Hello%22)%3Cbr%3E%0A -%3Cbr%3E%0A publishSubject.o @@ -7354,37 +7354,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;print($0) @@ -7383,21 +7383,16 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D).addDi @@ -7424,34 +7424,24 @@ g%3E%3Cbr%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A %3C/strong%3E%3C/e @@ -7504,39 +7504,24 @@ 2 won't%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A publishSubje @@ -7539,29 +7539,24 @@ Hello%22)%3Cbr%3E%0A -%3Cbr%3E%0A publishSubje @@ -7583,36 +7583,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A // Sub2 @@ -7652,29 +7652,24 @@ d later%3Cbr%3E%0A -%3Cbr%3E%0A let subscrip @@ -7706,37 +7706,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;print(#li @@ -7745,35 +7745,15 @@ br%3E%0A -%3Cbr%3E%0A %7D)%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A publ @@ -9880,37 +9880,12 @@ the -%3Cstrong%3Emap%3C/strong%3E %3Cstrong%3E +map oper @@ -9980,25 +9980,16 @@ mitting. -%3C/strong%3E &nbsp;%3C/ @@ -10041,29 +10041,24 @@ lue in %3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;retur @@ -10070,29 +10070,24 @@ ue * 10%3Cbr%3E%0A -%3Cbr%3E%0A %7D.subscribe( @@ -10095,29 +10095,24 @@ nNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;print @@ -10120,33 +10120,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -10205,45 +10205,19 @@ %3Ch3%3E -%3Cem%3E%3Cstrong%3E4.2 FlatMap%3C/strong%3E%3C/em%3E +4.2 FlatMap %3C/h3 @@ -10575,29 +10575,24 @@ of(1,2)%3Cbr%3E%0A -%3Cbr%3E%0A let sequence @@ -10620,39 +10620,24 @@ of(1,2)%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A let sequence @@ -10689,21 +10689,16 @@ e2)%3Cbr%3E%0A -%3Cbr%3E%0A sequence @@ -10745,37 +10745,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -10786,33 +10786,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -11052,29 +11052,24 @@ alue in%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -11099,21 +11099,16 @@ lue%3Cbr%3E%0A -%3Cbr%3E%0A %7D.subscr @@ -11116,37 +11116,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -11157,33 +11157,51 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E%3Cstrong%3E OUTPUT: @@ -11213,16 +11213,25 @@ 10 15%3C/ +strong%3E%3C/ code%3E%3C/p @@ -11448,29 +11448,24 @@ tervals%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -11553,29 +11553,24 @@ uler:s)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -11628,37 +11628,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -11673,45 +11673,35 @@ br%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstr @@ -12201,37 +12201,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -12254,33 +12254,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -12565,37 +12565,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -12606,33 +12606,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -13182,37 +13182,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -13223,33 +13223,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -13489,37 +13489,32 @@ shSubject()%3Cbr%3E%0A -%3Cbr%3E%0A let publish2 = P @@ -13550,26 +13550,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A %3C/strong @@ -13620,37 +13620,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -13653,37 +13653,32 @@ p;print($0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E @@ -13669,34 +13669,24 @@ %7D)%3Cbr%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A publish1.onN @@ -13689,37 +13689,32 @@ .onNext(20)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onNext( @@ -13717,29 +13717,24 @@ ext(40)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onN @@ -13741,29 +13741,24 @@ ext(60)%3Cbr%3E%0A -%3Cbr%3E%0A publish2.onN @@ -13764,29 +13764,24 @@ Next(1)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onN @@ -13788,29 +13788,24 @@ ext(80)%3Cbr%3E%0A -%3Cbr%3E%0A publish2.onN @@ -13811,29 +13811,24 @@ Next(2)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onN @@ -13836,25 +13836,40 @@ xt(100)%3C -br%3E%0A%3Cbr%3E%0A +/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -14436,29 +14436,24 @@ ,3,4,5)%3Cbr%3E%0A -%3Cbr%3E%0A let b = Obse @@ -14488,26 +14488,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A Observab @@ -14538,29 +14538,24 @@ cribe %7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -14579,24 +14579,34 @@ br%3E%0A -%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A +%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstr @@ -15339,29 +15339,24 @@ Next: %7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -15424,21 +15424,16 @@ ion%3Cbr%3E%0A -%3Cbr%3E%0A *%7D).subs @@ -15443,37 +15443,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -15484,21 +15484,16 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D)%3C/code @@ -15531,52 +15531,14 @@ %0A%3Cp%3E -%3Ca href=%22https://goo.gl/b5YD8Kcontent_copy%22%3E +&nbsp; Oper @@ -16052,20 +16052,22 @@ RxSwift: -%3C/a%3E +&nbsp; &nbsp;%3C/ @@ -17709,29 +17709,24 @@ bject()%3Cbr%3E%0A -%3Cbr%3E%0A let publish2 @@ -17754,26 +17754,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A let conc @@ -17831,29 +17831,24 @@ ground)%3Cbr%3E%0A -%3Cbr%3E%0A Observable.o @@ -17868,29 +17868,24 @@ blish2)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -17959,29 +17959,24 @@ eduler)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -18027,29 +18027,24 @@ merge()%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -18116,29 +18116,24 @@ uler())%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -18195,29 +18195,24 @@ nNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -18232,21 +18232,16 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3C @@ -18244,26 +18244,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A publish1 @@ -18264,29 +18264,24 @@ ext(20)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onN @@ -18288,25 +18288,40 @@ ext(40)%3C -br%3E%0A%3Cbr%3E%0A +/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E
json metadata{"tags":["programming","rxswift","ios","swift"],"links":["https://developer.apple.com/reference/swift/sequence","https://github.com/SebastianBoldt/Learn-and-Master-RxSwift","http://rxmarbles.com/","https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8","https://goo.gl/b5YD8Kcontent_copy","https://github.com/SebastianBoldt","https://twitter.com/sebastianboldt","https://de.linkedin.com/in/sebastian-boldt-9b465261","https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p","https://soundcloud.com/sebastian_boldt","https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md","http://reactivex.io/documentation/operators.html"],"app":"steemit/0.1","format":"html","image":["https://cdn-images-1.medium.com/max/4000/1*iVjIzql9k7PpwEUdb0phwQ.png"]}
Transaction InfoBlock #17106548/Trx 13118704830ae0502f2f57c56acfa47f92b97c58
View Raw JSON Data
{
  "trx_id": "13118704830ae0502f2f57c56acfa47f92b97c58",
  "block": 17106548,
  "trx_in_block": 22,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T18:20:03",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "programming",
      "author": "sebastianboldt",
      "permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "title": "Learn & Master ⚔️ the Basics of RxSwift in 10 Minutes",
      "body": "@@ -7,12 +7,8 @@\n %0A%3Cp%3E\n-!%5B%5D(\n http\n@@ -72,17 +72,16 @@\n phwQ.png\n-)\n %3C/p%3E%0A%3Cp%3E\n@@ -1246,579 +1246,255 @@\n  in \n-%3Cem%3E%3Cstrong%3ERxSwift%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eis an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eor something that operates on or subscribes to events emitted by an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence.%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EArrays,%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EStrings or Dictionaries%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ewill be converted to%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequences%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ein%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3ERxSwift. You can create an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3E\n+RxSwift is an observable sequence or something that operates on or subscribes to events emitted by an observable sequence. Arrays, Strings or Dictionaries will be converted to observable sequences in RxSwift. You can create an observable sequence \n of a\n@@ -1523,30 +1523,16 @@\n s to the\n-%3C/strong%3E%3C/em%3E\n  %3Ca href\n@@ -1591,90 +1591,30 @@\n ce%22%3E\n-%3Cem%3E%3Cstrong%3ESequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EProtocol%3C/strong%3E%3C/em%3E%3C/a%3E %3Cstrong%3E\n+Sequence Protocol%3C/a%3E \n from\n@@ -1641,34 +1641,17 @@\n Library.\n-%3C/strong%3E %3Cstrong%3E\n+ \n Let%E2%80%99s cr\n@@ -1683,25 +1683,16 @@\n ences:%3C/\n-strong%3E%3C/\n p%3E%0A%3Cpre%3E\n@@ -1745,29 +1745,24 @@\n lo Rx%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let fibonacc\n@@ -1806,29 +1806,24 @@\n 3,5,8%5D)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let dictSequ\n@@ -2144,29 +2144,24 @@\n lo Rx%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let subscrip\n@@ -2202,29 +2202,24 @@\n vent in%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;print\n@@ -2230,32 +2230,42 @@\n nt)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -2277,21 +2277,16 @@\n T: %3Cbr%3E%0A\n-%3Cbr%3E%0A\n next(%22He\n@@ -2295,29 +2295,24 @@\n o Rx%22) %3Cbr%3E%0A\n-%3Cbr%3E%0A\n completed%3C/s\n@@ -2334,28 +2334,16 @@\n pre%3E%0A%3Cp%3E\n-%3Cem%3E%3Cstrong%3E\n Observab\n@@ -2367,333 +2367,99 @@\n emit\n-%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ezero%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eor more events%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eover their lifetimes. In%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3ERxSwift%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ean%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EEvent%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eis just an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EEnumeration Type%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3E\n+ zero or more events over their lifetimes. In RxSwift an Event is just an Enumeration Type \n with\n@@ -2477,30 +2477,16 @@\n  states:\n-%3C/strong%3E%3C/em%3E\n &nbsp;%3C/\n@@ -3142,29 +3142,24 @@\n %22,%22o%22%5D)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let subscrip\n@@ -3243,29 +3243,24 @@\n ;&nbsp;%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3295,29 +3295,24 @@\n value):%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3367,36 +3367,25 @@\n (value)%3Cbr%3E%0A\n-%3Cbr%3E%0A &nbsp;\n+ \n &nbsp;&nbsp;\n@@ -3420,29 +3420,24 @@\n error):%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3492,29 +3492,24 @@\n (error)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3544,29 +3544,24 @@\n pleted:%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3644,32 +3644,42 @@\n p;%7D%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cem%3E%3Cstr\n@@ -3682,26 +3682,16 @@\n %3Cstrong%3E\n-%3Cbr%3E%0A%3Cbr%3E%0A\n OUTPUT:%3C\n@@ -3694,21 +3694,16 @@\n UT:%3Cbr%3E%0A\n-%3Cbr%3E%0A\n H e l l \n@@ -3709,21 +3709,16 @@\n  o %3Cbr%3E%0A\n-%3Cbr%3E%0A\n complete\n@@ -4316,29 +4316,24 @@\n rrectly%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let bag = Di\n@@ -4348,34 +4348,24 @@\n ()%3Cbr%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n // Creating \n@@ -4413,29 +4413,24 @@\n g value%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let observab\n@@ -4467,31 +4467,16 @@\n !%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n // Creat\n@@ -4575,29 +4575,24 @@\n Next:%7B %3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -4604,37 +4604,32 @@\n p;print($0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E\n@@ -4624,26 +4624,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n // Addin\n@@ -4672,21 +4672,16 @@\n Bag%3Cbr%3E%0A\n-%3Cbr%3E%0A\n subscrip\n@@ -6487,21 +6487,16 @@\n g()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n var publ\n@@ -6800,37 +6800,32 @@\n xt(%22Hello%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publishSubject.o\n@@ -7354,37 +7354,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;print($0)\n@@ -7383,21 +7383,16 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D).addDi\n@@ -7424,34 +7424,24 @@\n g%3E%3Cbr%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n %3C/strong%3E%3C/e\n@@ -7504,39 +7504,24 @@\n 2 won't%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n publishSubje\n@@ -7539,29 +7539,24 @@\n Hello%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publishSubje\n@@ -7583,36 +7583,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n // Sub2 \n@@ -7652,29 +7652,24 @@\n d later%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let subscrip\n@@ -7706,37 +7706,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;print(#li\n@@ -7745,35 +7745,15 @@\n br%3E%0A\n-%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n publ\n@@ -9880,37 +9880,12 @@\n the \n-%3Cstrong%3Emap%3C/strong%3E %3Cstrong%3E\n+map \n oper\n@@ -9980,25 +9980,16 @@\n mitting.\n-%3C/strong%3E\n &nbsp;%3C/\n@@ -10041,29 +10041,24 @@\n lue in %3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;retur\n@@ -10070,29 +10070,24 @@\n ue * 10%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D.subscribe(\n@@ -10095,29 +10095,24 @@\n nNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;print\n@@ -10120,33 +10120,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -10205,45 +10205,19 @@\n %3Ch3%3E\n-%3Cem%3E%3Cstrong%3E4.2 FlatMap%3C/strong%3E%3C/em%3E\n+4.2 FlatMap\n %3C/h3\n@@ -10575,29 +10575,24 @@\n of(1,2)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let sequence\n@@ -10620,39 +10620,24 @@\n of(1,2)%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n let sequence\n@@ -10689,21 +10689,16 @@\n e2)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n sequence\n@@ -10745,37 +10745,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -10786,33 +10786,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -11052,29 +11052,24 @@\n alue in%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -11099,21 +11099,16 @@\n lue%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D.subscr\n@@ -11116,37 +11116,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -11157,33 +11157,51 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E%3Cstrong%3E\n OUTPUT: \n@@ -11213,16 +11213,25 @@\n  10 15%3C/\n+strong%3E%3C/\n code%3E%3C/p\n@@ -11448,29 +11448,24 @@\n tervals%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -11553,29 +11553,24 @@\n uler:s)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -11628,37 +11628,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -11673,45 +11673,35 @@\n br%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstr\n@@ -12201,37 +12201,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -12254,33 +12254,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -12565,37 +12565,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -12606,33 +12606,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -13182,37 +13182,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -13223,33 +13223,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -13489,37 +13489,32 @@\n shSubject()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let publish2 = P\n@@ -13550,26 +13550,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n %3C/strong\n@@ -13620,37 +13620,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -13653,37 +13653,32 @@\n p;print($0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E\n@@ -13669,34 +13669,24 @@\n %7D)%3Cbr%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n publish1.onN\n@@ -13689,37 +13689,32 @@\n .onNext(20)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onNext(\n@@ -13717,29 +13717,24 @@\n ext(40)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onN\n@@ -13741,29 +13741,24 @@\n ext(60)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish2.onN\n@@ -13764,29 +13764,24 @@\n Next(1)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onN\n@@ -13788,29 +13788,24 @@\n ext(80)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish2.onN\n@@ -13811,29 +13811,24 @@\n Next(2)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onN\n@@ -13836,25 +13836,40 @@\n xt(100)%3C\n-br%3E%0A%3Cbr%3E%0A\n+/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -14436,29 +14436,24 @@\n ,3,4,5)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let b = Obse\n@@ -14488,26 +14488,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n Observab\n@@ -14538,29 +14538,24 @@\n cribe %7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -14579,24 +14579,34 @@\n br%3E%0A\n-%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstr\n@@ -15339,29 +15339,24 @@\n Next: %7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -15424,21 +15424,16 @@\n ion%3Cbr%3E%0A\n-%3Cbr%3E%0A\n *%7D).subs\n@@ -15443,37 +15443,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -15484,21 +15484,16 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D)%3C/code\n@@ -15531,52 +15531,14 @@\n %0A%3Cp%3E\n-%3Ca href=%22https://goo.gl/b5YD8Kcontent_copy%22%3E\n+&nbsp;\n Oper\n@@ -16052,20 +16052,22 @@\n RxSwift:\n-%3C/a%3E\n+&nbsp;\n &nbsp;%3C/\n@@ -17709,29 +17709,24 @@\n bject()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let publish2\n@@ -17754,26 +17754,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n let conc\n@@ -17831,29 +17831,24 @@\n ground)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n Observable.o\n@@ -17868,29 +17868,24 @@\n blish2)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -17959,29 +17959,24 @@\n eduler)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -18027,29 +18027,24 @@\n merge()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -18116,29 +18116,24 @@\n uler())%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -18195,29 +18195,24 @@\n nNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -18232,21 +18232,16 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3C\n@@ -18244,26 +18244,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n publish1\n@@ -18264,29 +18264,24 @@\n ext(20)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onN\n@@ -18288,25 +18288,40 @@\n ext(40)%3C\n-br%3E%0A%3Cbr%3E%0A\n+/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n",
      "json_metadata": "{\"tags\":[\"programming\",\"rxswift\",\"ios\",\"swift\"],\"links\":[\"https://developer.apple.com/reference/swift/sequence\",\"https://github.com/SebastianBoldt/Learn-and-Master-RxSwift\",\"http://rxmarbles.com/\",\"https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8\",\"https://goo.gl/b5YD8Kcontent_copy\",\"https://github.com/SebastianBoldt\",\"https://twitter.com/sebastianboldt\",\"https://de.linkedin.com/in/sebastian-boldt-9b465261\",\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\",\"https://soundcloud.com/sebastian_boldt\",\"https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md\",\"http://reactivex.io/documentation/operators.html\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://cdn-images-1.medium.com/max/4000/1*iVjIzql9k7PpwEUdb0phwQ.png\"]}"
    }
  ]
}
2017/11/10 18:16:30
votersqube
authorsebastianboldt
permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
weight100 (1.00%)
Transaction InfoBlock #17106477/Trx bdb1eef2b9ffd169dd497990e3c3ff6ca8963526
View Raw JSON Data
{
  "trx_id": "bdb1eef2b9ffd169dd497990e3c3ff6ca8963526",
  "block": 17106477,
  "trx_in_block": 22,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T18:16:30",
  "op": [
    "vote",
    {
      "voter": "sqube",
      "author": "sebastianboldt",
      "permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "weight": 100
    }
  ]
}
2017/11/10 18:15:36
parent author
parent permlinkprogramming
authorsebastianboldt
permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
titleLearn & Master ⚔️ the Basics of RxSwift in 10 Minutes
body@@ -7,12 +7,8 @@ %0A%3Cp%3E -!%5B%5D( http @@ -72,17 +72,16 @@ phwQ.png -) %3C/p%3E%0A%3Cp%3E @@ -1246,579 +1246,255 @@ in -%3Cem%3E%3Cstrong%3ERxSwift%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eis an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eor something that operates on or subscribes to events emitted by an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence.%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EArrays,%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EStrings or Dictionaries%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ewill be converted to%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequences%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ein%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3ERxSwift. You can create an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3E +RxSwift is an observable sequence or something that operates on or subscribes to events emitted by an observable sequence. Arrays, Strings or Dictionaries will be converted to observable sequences in RxSwift. You can create an observable sequence of a @@ -1523,30 +1523,16 @@ s to the -%3C/strong%3E%3C/em%3E %3Ca href @@ -1591,90 +1591,30 @@ ce%22%3E -%3Cem%3E%3Cstrong%3ESequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EProtocol%3C/strong%3E%3C/em%3E%3C/a%3E %3Cstrong%3E +Sequence Protocol%3C/a%3E from @@ -1641,34 +1641,17 @@ Library. -%3C/strong%3E %3Cstrong%3E + Let%E2%80%99s cr @@ -1683,25 +1683,16 @@ ences:%3C/ -strong%3E%3C/ p%3E%0A%3Cpre%3E @@ -1745,29 +1745,24 @@ lo Rx%22)%3Cbr%3E%0A -%3Cbr%3E%0A let fibonacc @@ -1806,29 +1806,24 @@ 3,5,8%5D)%3Cbr%3E%0A -%3Cbr%3E%0A let dictSequ @@ -2144,29 +2144,24 @@ lo Rx%22)%3Cbr%3E%0A -%3Cbr%3E%0A let subscrip @@ -2202,29 +2202,24 @@ vent in%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;print @@ -2230,32 +2230,42 @@ nt)%3Cbr%3E%0A -%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A +%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -2277,21 +2277,16 @@ T: %3Cbr%3E%0A -%3Cbr%3E%0A next(%22He @@ -2295,29 +2295,24 @@ o Rx%22) %3Cbr%3E%0A -%3Cbr%3E%0A completed%3C/s @@ -2334,28 +2334,16 @@ pre%3E%0A%3Cp%3E -%3Cem%3E%3Cstrong%3E Observab @@ -2367,333 +2367,99 @@ emit -%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ezero%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eor more events%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eover their lifetimes. In%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3ERxSwift%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ean%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EEvent%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eis just an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EEnumeration Type%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3E + zero or more events over their lifetimes. In RxSwift an Event is just an Enumeration Type with @@ -2477,30 +2477,16 @@ states: -%3C/strong%3E%3C/em%3E &nbsp;%3C/ @@ -3142,29 +3142,24 @@ %22,%22o%22%5D)%3Cbr%3E%0A -%3Cbr%3E%0A let subscrip @@ -3243,29 +3243,24 @@ ;&nbsp;%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3295,29 +3295,24 @@ value):%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3367,36 +3367,25 @@ (value)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp; + &nbsp;&nbsp; @@ -3420,29 +3420,24 @@ error):%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3492,29 +3492,24 @@ (error)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3544,29 +3544,24 @@ pleted:%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -3644,32 +3644,42 @@ p;%7D%3Cbr%3E%0A -%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A +%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cem%3E%3Cstr @@ -3682,26 +3682,16 @@ %3Cstrong%3E -%3Cbr%3E%0A%3Cbr%3E%0A OUTPUT:%3C @@ -3694,21 +3694,16 @@ UT:%3Cbr%3E%0A -%3Cbr%3E%0A H e l l @@ -3709,21 +3709,16 @@ o %3Cbr%3E%0A -%3Cbr%3E%0A complete @@ -4316,29 +4316,24 @@ rrectly%3Cbr%3E%0A -%3Cbr%3E%0A let bag = Di @@ -4348,34 +4348,24 @@ ()%3Cbr%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A // Creating @@ -4413,29 +4413,24 @@ g value%3Cbr%3E%0A -%3Cbr%3E%0A let observab @@ -4467,31 +4467,16 @@ !%22)%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A // Creat @@ -4575,29 +4575,24 @@ Next:%7B %3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -4604,37 +4604,32 @@ p;print($0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E @@ -4624,26 +4624,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A // Addin @@ -4672,21 +4672,16 @@ Bag%3Cbr%3E%0A -%3Cbr%3E%0A subscrip @@ -6487,21 +6487,16 @@ g()%3Cbr%3E%0A -%3Cbr%3E%0A var publ @@ -6800,37 +6800,32 @@ xt(%22Hello%22)%3Cbr%3E%0A -%3Cbr%3E%0A publishSubject.o @@ -7354,37 +7354,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;print($0) @@ -7383,21 +7383,16 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D).addDi @@ -7424,34 +7424,24 @@ g%3E%3Cbr%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A %3C/strong%3E%3C/e @@ -7504,39 +7504,24 @@ 2 won't%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A publishSubje @@ -7539,29 +7539,24 @@ Hello%22)%3Cbr%3E%0A -%3Cbr%3E%0A publishSubje @@ -7583,36 +7583,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A // Sub2 @@ -7652,29 +7652,24 @@ d later%3Cbr%3E%0A -%3Cbr%3E%0A let subscrip @@ -7706,37 +7706,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;print(#li @@ -7745,35 +7745,15 @@ br%3E%0A -%3Cbr%3E%0A %7D)%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A publ @@ -9880,37 +9880,12 @@ the -%3Cstrong%3Emap%3C/strong%3E %3Cstrong%3E +map oper @@ -9980,25 +9980,16 @@ mitting. -%3C/strong%3E &nbsp;%3C/ @@ -10041,29 +10041,24 @@ lue in %3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;retur @@ -10070,29 +10070,24 @@ ue * 10%3Cbr%3E%0A -%3Cbr%3E%0A %7D.subscribe( @@ -10095,29 +10095,24 @@ nNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;print @@ -10120,33 +10120,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -10205,45 +10205,19 @@ %3Ch3%3E -%3Cem%3E%3Cstrong%3E4.2 FlatMap%3C/strong%3E%3C/em%3E +4.2 FlatMap %3C/h3 @@ -10575,29 +10575,24 @@ of(1,2)%3Cbr%3E%0A -%3Cbr%3E%0A let sequence @@ -10620,39 +10620,24 @@ of(1,2)%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A let sequence @@ -10689,21 +10689,16 @@ e2)%3Cbr%3E%0A -%3Cbr%3E%0A sequence @@ -10745,37 +10745,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -10786,33 +10786,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -11052,29 +11052,24 @@ alue in%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -11099,21 +11099,16 @@ lue%3Cbr%3E%0A -%3Cbr%3E%0A %7D.subscr @@ -11116,37 +11116,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -11157,33 +11157,51 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E%3Cstrong%3E OUTPUT: @@ -11213,16 +11213,25 @@ 10 15%3C/ +strong%3E%3C/ code%3E%3C/p @@ -11448,29 +11448,24 @@ tervals%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -11553,29 +11553,24 @@ uler:s)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -11628,37 +11628,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -11673,45 +11673,35 @@ br%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstr @@ -12201,37 +12201,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -12254,33 +12254,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -12565,37 +12565,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -12606,33 +12606,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -13182,37 +13182,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -13223,33 +13223,43 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -13489,37 +13489,32 @@ shSubject()%3Cbr%3E%0A -%3Cbr%3E%0A let publish2 = P @@ -13550,26 +13550,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A %3C/strong @@ -13620,37 +13620,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -13653,37 +13653,32 @@ p;print($0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E @@ -13669,34 +13669,24 @@ %7D)%3Cbr%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A publish1.onN @@ -13689,37 +13689,32 @@ .onNext(20)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onNext( @@ -13717,29 +13717,24 @@ ext(40)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onN @@ -13741,29 +13741,24 @@ ext(60)%3Cbr%3E%0A -%3Cbr%3E%0A publish2.onN @@ -13764,29 +13764,24 @@ Next(1)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onN @@ -13788,29 +13788,24 @@ ext(80)%3Cbr%3E%0A -%3Cbr%3E%0A publish2.onN @@ -13811,29 +13811,24 @@ Next(2)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onN @@ -13836,25 +13836,40 @@ xt(100)%3C -br%3E%0A%3Cbr%3E%0A +/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E @@ -14436,29 +14436,24 @@ ,3,4,5)%3Cbr%3E%0A -%3Cbr%3E%0A let b = Obse @@ -14488,26 +14488,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A Observab @@ -14538,29 +14538,24 @@ cribe %7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -14579,24 +14579,34 @@ br%3E%0A -%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A +%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstr @@ -15339,29 +15339,24 @@ Next: %7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -15424,21 +15424,16 @@ ion%3Cbr%3E%0A -%3Cbr%3E%0A *%7D).subs @@ -15443,37 +15443,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -15484,21 +15484,16 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D)%3C/code @@ -17745,29 +17745,24 @@ bject()%3Cbr%3E%0A -%3Cbr%3E%0A let publish2 @@ -17790,26 +17790,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A let conc @@ -17867,29 +17867,24 @@ ground)%3Cbr%3E%0A -%3Cbr%3E%0A Observable.o @@ -17904,29 +17904,24 @@ blish2)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -17995,29 +17995,24 @@ eduler)%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -18063,29 +18063,24 @@ merge()%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -18152,29 +18152,24 @@ uler())%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -18231,29 +18231,24 @@ nNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &nbsp;&nbsp @@ -18268,21 +18268,16 @@ $0)%3Cbr%3E%0A -%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3C @@ -18280,26 +18280,16 @@ r%3E%0A%3Cbr%3E%0A -%3Cbr%3E%0A%3Cbr%3E%0A publish1 @@ -18300,29 +18300,24 @@ ext(20)%3Cbr%3E%0A -%3Cbr%3E%0A publish1.onN @@ -18324,25 +18324,40 @@ ext(40)%3C -br%3E%0A%3Cbr%3E%0A +/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E %3Cstrong%3E
json metadata{"tags":["programming","rxswift","ios","swift"],"links":["https://developer.apple.com/reference/swift/sequence","https://github.com/SebastianBoldt/Learn-and-Master-RxSwift","http://rxmarbles.com/","https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8","https://goo.gl/b5YD8Kcontent_copy","https://github.com/SebastianBoldt","https://twitter.com/sebastianboldt","https://de.linkedin.com/in/sebastian-boldt-9b465261","https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p","https://soundcloud.com/sebastian_boldt","https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md","http://reactivex.io/documentation/operators.html"],"app":"steemit/0.1","format":"html","image":["https://cdn-images-1.medium.com/max/4000/1*iVjIzql9k7PpwEUdb0phwQ.png"]}
Transaction InfoBlock #17106459/Trx b2defc93a259e1a69ca5c01f044cdc73fb8eddf4
View Raw JSON Data
{
  "trx_id": "b2defc93a259e1a69ca5c01f044cdc73fb8eddf4",
  "block": 17106459,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T18:15:36",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "programming",
      "author": "sebastianboldt",
      "permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "title": "Learn & Master ⚔️ the Basics of RxSwift in 10 Minutes",
      "body": "@@ -7,12 +7,8 @@\n %0A%3Cp%3E\n-!%5B%5D(\n http\n@@ -72,17 +72,16 @@\n phwQ.png\n-)\n %3C/p%3E%0A%3Cp%3E\n@@ -1246,579 +1246,255 @@\n  in \n-%3Cem%3E%3Cstrong%3ERxSwift%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eis an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eor something that operates on or subscribes to events emitted by an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence.%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EArrays,%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EStrings or Dictionaries%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ewill be converted to%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequences%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ein%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3ERxSwift. You can create an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eobservable sequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3E\n+RxSwift is an observable sequence or something that operates on or subscribes to events emitted by an observable sequence. Arrays, Strings or Dictionaries will be converted to observable sequences in RxSwift. You can create an observable sequence \n of a\n@@ -1523,30 +1523,16 @@\n s to the\n-%3C/strong%3E%3C/em%3E\n  %3Ca href\n@@ -1591,90 +1591,30 @@\n ce%22%3E\n-%3Cem%3E%3Cstrong%3ESequence%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EProtocol%3C/strong%3E%3C/em%3E%3C/a%3E %3Cstrong%3E\n+Sequence Protocol%3C/a%3E \n from\n@@ -1641,34 +1641,17 @@\n Library.\n-%3C/strong%3E %3Cstrong%3E\n+ \n Let%E2%80%99s cr\n@@ -1683,25 +1683,16 @@\n ences:%3C/\n-strong%3E%3C/\n p%3E%0A%3Cpre%3E\n@@ -1745,29 +1745,24 @@\n lo Rx%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let fibonacc\n@@ -1806,29 +1806,24 @@\n 3,5,8%5D)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let dictSequ\n@@ -2144,29 +2144,24 @@\n lo Rx%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let subscrip\n@@ -2202,29 +2202,24 @@\n vent in%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;print\n@@ -2230,32 +2230,42 @@\n nt)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -2277,21 +2277,16 @@\n T: %3Cbr%3E%0A\n-%3Cbr%3E%0A\n next(%22He\n@@ -2295,29 +2295,24 @@\n o Rx%22) %3Cbr%3E%0A\n-%3Cbr%3E%0A\n completed%3C/s\n@@ -2334,28 +2334,16 @@\n pre%3E%0A%3Cp%3E\n-%3Cem%3E%3Cstrong%3E\n Observab\n@@ -2367,333 +2367,99 @@\n emit\n-%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ezero%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eor more events%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eover their lifetimes. In%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3ERxSwift%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Ean%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EEvent%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3Eis just an%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3EEnumeration Type%3C/strong%3E%3C/em%3E %3Cem%3E%3Cstrong%3E\n+ zero or more events over their lifetimes. In RxSwift an Event is just an Enumeration Type \n with\n@@ -2477,30 +2477,16 @@\n  states:\n-%3C/strong%3E%3C/em%3E\n &nbsp;%3C/\n@@ -3142,29 +3142,24 @@\n %22,%22o%22%5D)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let subscrip\n@@ -3243,29 +3243,24 @@\n ;&nbsp;%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3295,29 +3295,24 @@\n value):%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3367,36 +3367,25 @@\n (value)%3Cbr%3E%0A\n-%3Cbr%3E%0A &nbsp;\n+ \n &nbsp;&nbsp;\n@@ -3420,29 +3420,24 @@\n error):%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3492,29 +3492,24 @@\n (error)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3544,29 +3544,24 @@\n pleted:%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -3644,32 +3644,42 @@\n p;%7D%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cem%3E%3Cstr\n@@ -3682,26 +3682,16 @@\n %3Cstrong%3E\n-%3Cbr%3E%0A%3Cbr%3E%0A\n OUTPUT:%3C\n@@ -3694,21 +3694,16 @@\n UT:%3Cbr%3E%0A\n-%3Cbr%3E%0A\n H e l l \n@@ -3709,21 +3709,16 @@\n  o %3Cbr%3E%0A\n-%3Cbr%3E%0A\n complete\n@@ -4316,29 +4316,24 @@\n rrectly%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let bag = Di\n@@ -4348,34 +4348,24 @@\n ()%3Cbr%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n // Creating \n@@ -4413,29 +4413,24 @@\n g value%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let observab\n@@ -4467,31 +4467,16 @@\n !%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n // Creat\n@@ -4575,29 +4575,24 @@\n Next:%7B %3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -4604,37 +4604,32 @@\n p;print($0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E\n@@ -4624,26 +4624,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n // Addin\n@@ -4672,21 +4672,16 @@\n Bag%3Cbr%3E%0A\n-%3Cbr%3E%0A\n subscrip\n@@ -6487,21 +6487,16 @@\n g()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n var publ\n@@ -6800,37 +6800,32 @@\n xt(%22Hello%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publishSubject.o\n@@ -7354,37 +7354,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;print($0)\n@@ -7383,21 +7383,16 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D).addDi\n@@ -7424,34 +7424,24 @@\n g%3E%3Cbr%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n %3C/strong%3E%3C/e\n@@ -7504,39 +7504,24 @@\n 2 won't%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n publishSubje\n@@ -7539,29 +7539,24 @@\n Hello%22)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publishSubje\n@@ -7583,36 +7583,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n // Sub2 \n@@ -7652,29 +7652,24 @@\n d later%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let subscrip\n@@ -7706,37 +7706,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;print(#li\n@@ -7745,35 +7745,15 @@\n br%3E%0A\n-%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n publ\n@@ -9880,37 +9880,12 @@\n the \n-%3Cstrong%3Emap%3C/strong%3E %3Cstrong%3E\n+map \n oper\n@@ -9980,25 +9980,16 @@\n mitting.\n-%3C/strong%3E\n &nbsp;%3C/\n@@ -10041,29 +10041,24 @@\n lue in %3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;retur\n@@ -10070,29 +10070,24 @@\n ue * 10%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D.subscribe(\n@@ -10095,29 +10095,24 @@\n nNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;print\n@@ -10120,33 +10120,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -10205,45 +10205,19 @@\n %3Ch3%3E\n-%3Cem%3E%3Cstrong%3E4.2 FlatMap%3C/strong%3E%3C/em%3E\n+4.2 FlatMap\n %3C/h3\n@@ -10575,29 +10575,24 @@\n of(1,2)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let sequence\n@@ -10620,39 +10620,24 @@\n of(1,2)%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n let sequence\n@@ -10689,21 +10689,16 @@\n e2)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n sequence\n@@ -10745,37 +10745,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -10786,33 +10786,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -11052,29 +11052,24 @@\n alue in%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -11099,21 +11099,16 @@\n lue%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D.subscr\n@@ -11116,37 +11116,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -11157,33 +11157,51 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E%3Cstrong%3E\n OUTPUT: \n@@ -11213,16 +11213,25 @@\n  10 15%3C/\n+strong%3E%3C/\n code%3E%3C/p\n@@ -11448,29 +11448,24 @@\n tervals%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -11553,29 +11553,24 @@\n uler:s)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -11628,37 +11628,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -11673,45 +11673,35 @@\n br%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstr\n@@ -12201,37 +12201,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -12254,33 +12254,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -12565,37 +12565,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -12606,33 +12606,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -13182,37 +13182,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -13223,33 +13223,43 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D)%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -13489,37 +13489,32 @@\n shSubject()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let publish2 = P\n@@ -13550,26 +13550,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n %3C/strong\n@@ -13620,37 +13620,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -13653,37 +13653,32 @@\n p;print($0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E\n@@ -13669,34 +13669,24 @@\n %7D)%3Cbr%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n publish1.onN\n@@ -13689,37 +13689,32 @@\n .onNext(20)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onNext(\n@@ -13717,29 +13717,24 @@\n ext(40)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onN\n@@ -13741,29 +13741,24 @@\n ext(60)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish2.onN\n@@ -13764,29 +13764,24 @@\n Next(1)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onN\n@@ -13788,29 +13788,24 @@\n ext(80)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish2.onN\n@@ -13811,29 +13811,24 @@\n Next(2)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onN\n@@ -13836,25 +13836,40 @@\n xt(100)%3C\n-br%3E%0A%3Cbr%3E%0A\n+/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n@@ -14436,29 +14436,24 @@\n ,3,4,5)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let b = Obse\n@@ -14488,26 +14488,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n Observab\n@@ -14538,29 +14538,24 @@\n cribe %7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -14579,24 +14579,34 @@\n br%3E%0A\n-%3Cbr%3E%0A%7D%3Cbr%3E%0A%3Cbr%3E%0A\n+%7D%3C/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstr\n@@ -15339,29 +15339,24 @@\n Next: %7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -15424,21 +15424,16 @@\n ion%3Cbr%3E%0A\n-%3Cbr%3E%0A\n *%7D).subs\n@@ -15443,37 +15443,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -15484,21 +15484,16 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D)%3C/code\n@@ -17745,29 +17745,24 @@\n bject()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n let publish2\n@@ -17790,26 +17790,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n let conc\n@@ -17867,29 +17867,24 @@\n ground)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n Observable.o\n@@ -17904,29 +17904,24 @@\n blish2)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -17995,29 +17995,24 @@\n eduler)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -18063,29 +18063,24 @@\n merge()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -18152,29 +18152,24 @@\n uler())%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -18231,29 +18231,24 @@\n nNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -18268,21 +18268,16 @@\n $0)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3C\n@@ -18280,26 +18280,16 @@\n r%3E%0A%3Cbr%3E%0A\n-%3Cbr%3E%0A%3Cbr%3E%0A\n publish1\n@@ -18300,29 +18300,24 @@\n ext(20)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n publish1.onN\n@@ -18324,25 +18324,40 @@\n ext(40)%3C\n-br%3E%0A%3Cbr%3E%0A\n+/code%3E%3C/pre%3E%0A%3Cpre%3E%3Ccode%3E\n %3Cstrong%3E\n",
      "json_metadata": "{\"tags\":[\"programming\",\"rxswift\",\"ios\",\"swift\"],\"links\":[\"https://developer.apple.com/reference/swift/sequence\",\"https://github.com/SebastianBoldt/Learn-and-Master-RxSwift\",\"http://rxmarbles.com/\",\"https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8\",\"https://goo.gl/b5YD8Kcontent_copy\",\"https://github.com/SebastianBoldt\",\"https://twitter.com/sebastianboldt\",\"https://de.linkedin.com/in/sebastian-boldt-9b465261\",\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\",\"https://soundcloud.com/sebastian_boldt\",\"https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md\",\"http://reactivex.io/documentation/operators.html\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://cdn-images-1.medium.com/max/4000/1*iVjIzql9k7PpwEUdb0phwQ.png\"]}"
    }
  ]
}
2017/11/10 18:08:54
votersebastianboldt
authorsebastianboldt
permlink7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
weight10000 (100.00%)
Transaction InfoBlock #17106325/Trx a9abafc197dae99db9fea4198c6dd139327b3838
View Raw JSON Data
{
  "trx_id": "a9abafc197dae99db9fea4198c6dd139327b3838",
  "block": 17106325,
  "trx_in_block": 22,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T18:08:54",
  "op": [
    "vote",
    {
      "voter": "sebastianboldt",
      "author": "sebastianboldt",
      "permlink": "7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "weight": 10000
    }
  ]
}
2017/11/10 18:05:06
parent author
parent permlinkprogramming
authorsebastianboldt
permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
titleLearn & Master ⚔️ the Basics of RxSwift in 10 Minutes
body@@ -3,16 +3,103 @@ tml%3E%0A%3Cp%3E +!%5B%5D(https://cdn-images-1.medium.com/max/4000/1*iVjIzql9k7PpwEUdb0phwQ.png)%3C/p%3E%0A%3Cp%3E%3Cbr%3E%0A Every pr @@ -2174,24 +2174,29 @@ lo Rx%22)%3Cbr%3E%0A +%3Cbr%3E%0A let fibonacc @@ -2240,24 +2240,29 @@ 3,5,8%5D)%3Cbr%3E%0A +%3Cbr%3E%0A let dictSequ @@ -2583,24 +2583,29 @@ lo Rx%22)%3Cbr%3E%0A +%3Cbr%3E%0A let subscrip @@ -2646,24 +2646,29 @@ vent in%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;print @@ -2675,30 +2675,40 @@ (event)%3Cbr%3E%0A +%3Cbr%3E%0A %7D%3Cbr%3E%0A +%3Cbr%3E%0A %3Cstrong%3EOUTP @@ -2716,16 +2716,21 @@ T: %3Cbr%3E%0A +%3Cbr%3E%0A next(%22He @@ -2739,24 +2739,29 @@ o Rx%22) %3Cbr%3E%0A +%3Cbr%3E%0A completed%3C/s @@ -3851,24 +3851,29 @@ %22,%22o%22%5D)%3Cbr%3E%0A +%3Cbr%3E%0A let subscrip @@ -3914,24 +3914,29 @@ vent in%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;switc @@ -3957,24 +3957,29 @@ ;&nbsp;%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -4014,24 +4014,29 @@ value):%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -4091,24 +4091,29 @@ (value)%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -4155,24 +4155,29 @@ error):%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -4232,24 +4232,29 @@ (error)%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -4289,24 +4289,29 @@ pleted:%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -4372,24 +4372,29 @@ leted%22)%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;%7D%3Cbr%3E @@ -4394,22 +4394,32 @@ p;%7D%3Cbr%3E%0A +%3Cbr%3E%0A %7D%3Cbr%3E%0A +%3Cbr%3E%0A %3Cem%3E%3Cstr @@ -4423,24 +4423,29 @@ strong%3E%3Cbr%3E%0A +%3Cbr%3E%0A OUTPUT:%3Cbr%3E%0A @@ -4444,16 +4444,21 @@ UT:%3Cbr%3E%0A +%3Cbr%3E%0A H e l l @@ -4460,24 +4460,29 @@ l l o %3Cbr%3E%0A +%3Cbr%3E%0A completed%3C/s @@ -5076,24 +5076,29 @@ rrectly%3Cbr%3E%0A +%3Cbr%3E%0A let bag = Di @@ -5109,32 +5109,42 @@ eBag()%3Cbr%3E%0A%3Cbr%3E%0A +%3Cbr%3E%0A%3Cbr%3E%0A // Creating an O @@ -5188,24 +5188,29 @@ g value%3Cbr%3E%0A +%3Cbr%3E%0A let observab @@ -5244,32 +5244,42 @@ Rx!%22)%3Cbr%3E%0A%3Cbr%3E%0A +%3Cbr%3E%0A%3Cbr%3E%0A // Creating a su @@ -5310,24 +5310,29 @@ events%3Cbr%3E%0A +%3Cbr%3E%0A let subscrip @@ -5370,24 +5370,29 @@ Next:%7B %3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -5404,32 +5404,37 @@ p;print($0)%3Cbr%3E%0A +%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3Cbr%3E%0A// A @@ -5429,16 +5429,26 @@ r%3E%0A%3Cbr%3E%0A +%3Cbr%3E%0A%3Cbr%3E%0A // Addin @@ -5487,16 +5487,21 @@ Bag%3Cbr%3E%0A +%3Cbr%3E%0A subscrip @@ -7307,16 +7307,21 @@ g()%3Cbr%3E%0A +%3Cbr%3E%0A var publ @@ -7625,32 +7625,37 @@ xt(%22Hello%22)%3Cbr%3E%0A +%3Cbr%3E%0A publishSubject.o @@ -8184,32 +8184,37 @@ be(onNext:%7B%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;print($0) @@ -8218,16 +8218,21 @@ $0)%3Cbr%3E%0A +%3Cbr%3E%0A %7D).addDi @@ -8260,32 +8260,42 @@ trong%3E%3Cbr%3E%0A%3Cbr%3E%0A +%3Cbr%3E%0A%3Cbr%3E%0A %3C/strong%3E%3C/em%3E// @@ -8355,32 +8355,42 @@ won't%3Cbr%3E%0A%3Cbr%3E%0A +%3Cbr%3E%0A%3Cbr%3E%0A publishSubject.o @@ -8404,24 +8404,29 @@ Hello%22)%3Cbr%3E%0A +%3Cbr%3E%0A publishSubje @@ -8458,16 +8458,31 @@ r%3E%0A%3Cbr%3E%0A +%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A // Sub2 @@ -8542,24 +8542,29 @@ d later%3Cbr%3E%0A +%3Cbr%3E%0A let subscrip @@ -8601,32 +8601,37 @@ be(onNext:%7B%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;print(#li @@ -8633,32 +8633,37 @@ t(#line,$0)%3Cbr%3E%0A +%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3Cbr%3E%0Apubl @@ -8650,32 +8650,42 @@ br%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%3Cbr%3E%0A%3Cbr%3E%0A publishSubject.o @@ -10995,24 +10995,29 @@ lue in %3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;retur @@ -11029,24 +11029,29 @@ ue * 10%3Cbr%3E%0A +%3Cbr%3E%0A %7D.subscribe( @@ -11059,24 +11059,29 @@ nNext:%7B%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;print @@ -11081,39 +11081,49 @@ p;print($0)%3Cbr%3E%0A +%3Cbr%3E%0A %7D)%3Cbr%3E%0A +%3Cbr%3E%0A %3Cstrong%3EOUTPUT: @@ -11560,24 +11560,29 @@ of(1,2)%3Cbr%3E%0A +%3Cbr%3E%0A let sequence @@ -11611,32 +11611,42 @@ f(1,2)%3Cbr%3E%0A%3Cbr%3E%0A +%3Cbr%3E%0A%3Cbr%3E%0A let sequenceOfSe @@ -11694,16 +11694,21 @@ e2)%3Cbr%3E%0A +%3Cbr%3E%0A sequence @@ -11755,32 +11755,37 @@ be(onNext:%7B%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -11793,39 +11793,49 @@ p;print($0)%3Cbr%3E%0A +%3Cbr%3E%0A %7D)%3Cbr%3E%0A +%3Cbr%3E%0A %3Cstrong%3EOUTPUT: @@ -12057,24 +12057,29 @@ alue in%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -12105,24 +12105,29 @@ + value%3Cbr%3E%0A +%3Cbr%3E%0A %7D.subscribe( @@ -12131,32 +12131,37 @@ be(onNext:%7B%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -12177,23 +12177,33 @@ $0)%3Cbr%3E%0A +%3Cbr%3E%0A %7D)%3Cbr%3E%0A +%3Cbr%3E%0A OUTPUT: @@ -12441,24 +12441,29 @@ tervals%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -12551,24 +12551,29 @@ uler:s)%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -12631,32 +12631,37 @@ be(onNext:%7B%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -12669,32 +12669,37 @@ p;print($0)%3Cbr%3E%0A +%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E @@ -12691,32 +12691,47 @@ )%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A +%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A %3Cstrong%3EOUTPUT: @@ -13219,32 +13219,37 @@ be(onNext:%7B%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -13269,39 +13269,49 @@ p;print($0)%3Cbr%3E%0A +%3Cbr%3E%0A %7D)%3Cbr%3E%0A +%3Cbr%3E%0A %3Cstrong%3EOUTPUT: @@ -13578,32 +13578,37 @@ be(onNext:%7B%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -13616,39 +13616,49 @@ p;print($0)%3Cbr%3E%0A +%3Cbr%3E%0A %7D)%3Cbr%3E%0A +%3Cbr%3E%0A %3Cstrong%3EOUTPUT: @@ -14190,32 +14190,37 @@ be(onNext:%7B%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -14236,23 +14236,33 @@ $0)%3Cbr%3E%0A +%3Cbr%3E%0A %7D)%3Cbr%3E%0A +%3Cbr%3E%0A %3Cstrong%3E @@ -14492,32 +14492,37 @@ shSubject()%3Cbr%3E%0A +%3Cbr%3E%0A let publish2 = P @@ -14550,32 +14550,42 @@ trong%3E%3Cbr%3E%0A%3Cbr%3E%0A +%3Cbr%3E%0A%3Cbr%3E%0A %3C/strong%3E%3C/em%3EOb @@ -14638,32 +14638,37 @@ be(onNext:%7B%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -14676,32 +14676,37 @@ p;print($0)%3Cbr%3E%0A +%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3Cbr%3E%0Apubl @@ -14693,32 +14693,42 @@ br%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%3Cbr%3E%0A%3Cbr%3E%0A publish1.onNext( @@ -14727,32 +14727,37 @@ .onNext(20)%3Cbr%3E%0A +%3Cbr%3E%0A publish1.onNext( @@ -14760,24 +14760,29 @@ ext(40)%3Cbr%3E%0A +%3Cbr%3E%0A publish1.onN @@ -14789,24 +14789,29 @@ ext(60)%3Cbr%3E%0A +%3Cbr%3E%0A publish2.onN @@ -14817,24 +14817,29 @@ Next(1)%3Cbr%3E%0A +%3Cbr%3E%0A publish1.onN @@ -14846,24 +14846,29 @@ ext(80)%3Cbr%3E%0A +%3Cbr%3E%0A publish2.onN @@ -14874,24 +14874,29 @@ Next(2)%3Cbr%3E%0A +%3Cbr%3E%0A publish1.onN @@ -14904,24 +14904,29 @@ xt(100)%3Cbr%3E%0A +%3Cbr%3E%0A %3Cstrong%3EOUTP @@ -15489,24 +15489,29 @@ ,3,4,5)%3Cbr%3E%0A +%3Cbr%3E%0A let b = Obse @@ -15542,24 +15542,34 @@ %22)%3Cbr%3E%0A%3Cbr%3E%0A +%3Cbr%3E%0A%3Cbr%3E%0A Observable.z @@ -15606,24 +15606,29 @@ cribe %7B%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -15648,22 +15648,32 @@ $0)%3Cbr%3E%0A +%3Cbr%3E%0A %7D%3Cbr%3E%0A +%3Cbr%3E%0A %3Cstrong%3E @@ -16402,24 +16402,29 @@ Next: %7B%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -16492,16 +16492,21 @@ ion%3Cbr%3E%0A +%3Cbr%3E%0A *%7D).subs @@ -16516,32 +16516,37 @@ be(onNext:%7B%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp;&nb @@ -16562,16 +16562,21 @@ $0)%3Cbr%3E%0A +%3Cbr%3E%0A %7D)%3C/code @@ -18828,24 +18828,29 @@ bject()%3Cbr%3E%0A +%3Cbr%3E%0A let publish2 @@ -18874,24 +18874,34 @@ ()%3Cbr%3E%0A%3Cbr%3E%0A +%3Cbr%3E%0A%3Cbr%3E%0A let concurre @@ -18965,24 +18965,29 @@ ground)%3Cbr%3E%0A +%3Cbr%3E%0A Observable.o @@ -19007,24 +19007,29 @@ blish2)%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -19103,24 +19103,29 @@ eduler)%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -19176,24 +19176,29 @@ merge()%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -19270,24 +19270,29 @@ uler())%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -19354,24 +19354,29 @@ nNext:%7B%3Cbr%3E%0A +%3Cbr%3E%0A &nbsp;&nbsp @@ -19392,24 +19392,29 @@ int($0)%3Cbr%3E%0A +%3Cbr%3E%0A %7D)%3Cbr%3E%0A%3Cbr%3E%0A @@ -19405,32 +19405,42 @@ br%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A +%3Cbr%3E%0A%3Cbr%3E%0A publish1.onNext( @@ -19443,24 +19443,29 @@ ext(20)%3Cbr%3E%0A +%3Cbr%3E%0A publish1.onN @@ -19472,24 +19472,29 @@ ext(40)%3Cbr%3E%0A +%3Cbr%3E%0A %3Cstrong%3EOUTP
json metadata{"tags":["programming","rxswift","ios","swift"],"links":["https://developer.apple.com/reference/swift/sequence","https://github.com/SebastianBoldt/Learn-and-Master-RxSwift","http://rxmarbles.com/","https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8","https://goo.gl/b5YD8Kcontent_copy","https://github.com/SebastianBoldt","https://twitter.com/sebastianboldt","https://de.linkedin.com/in/sebastian-boldt-9b465261","https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p","https://soundcloud.com/sebastian_boldt","https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md","http://reactivex.io/documentation/operators.html"],"app":"steemit/0.1","format":"html","image":["https://cdn-images-1.medium.com/max/4000/1*iVjIzql9k7PpwEUdb0phwQ.png"]}
Transaction InfoBlock #17106249/Trx 639c6b3a3cbdf5336accc970382d6e9a9abac106
View Raw JSON Data
{
  "trx_id": "639c6b3a3cbdf5336accc970382d6e9a9abac106",
  "block": 17106249,
  "trx_in_block": 22,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T18:05:06",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "programming",
      "author": "sebastianboldt",
      "permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "title": "Learn & Master ⚔️ the Basics of RxSwift in 10 Minutes",
      "body": "@@ -3,16 +3,103 @@\n tml%3E%0A%3Cp%3E\n+!%5B%5D(https://cdn-images-1.medium.com/max/4000/1*iVjIzql9k7PpwEUdb0phwQ.png)%3C/p%3E%0A%3Cp%3E%3Cbr%3E%0A\n Every pr\n@@ -2174,24 +2174,29 @@\n lo Rx%22)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n let fibonacc\n@@ -2240,24 +2240,29 @@\n 3,5,8%5D)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n let dictSequ\n@@ -2583,24 +2583,29 @@\n lo Rx%22)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n let subscrip\n@@ -2646,24 +2646,29 @@\n vent in%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;print\n@@ -2675,30 +2675,40 @@\n (event)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %3Cstrong%3EOUTP\n@@ -2716,16 +2716,21 @@\n T: %3Cbr%3E%0A\n+%3Cbr%3E%0A\n next(%22He\n@@ -2739,24 +2739,29 @@\n o Rx%22) %3Cbr%3E%0A\n+%3Cbr%3E%0A\n completed%3C/s\n@@ -3851,24 +3851,29 @@\n %22,%22o%22%5D)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n let subscrip\n@@ -3914,24 +3914,29 @@\n vent in%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;switc\n@@ -3957,24 +3957,29 @@\n ;&nbsp;%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -4014,24 +4014,29 @@\n value):%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -4091,24 +4091,29 @@\n (value)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -4155,24 +4155,29 @@\n error):%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -4232,24 +4232,29 @@\n (error)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -4289,24 +4289,29 @@\n pleted:%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -4372,24 +4372,29 @@\n leted%22)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;%7D%3Cbr%3E\n@@ -4394,22 +4394,32 @@\n p;%7D%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %3Cem%3E%3Cstr\n@@ -4423,24 +4423,29 @@\n strong%3E%3Cbr%3E%0A\n+%3Cbr%3E%0A\n OUTPUT:%3Cbr%3E%0A\n@@ -4444,16 +4444,21 @@\n UT:%3Cbr%3E%0A\n+%3Cbr%3E%0A\n H e l l \n@@ -4460,24 +4460,29 @@\n  l l o %3Cbr%3E%0A\n+%3Cbr%3E%0A\n completed%3C/s\n@@ -5076,24 +5076,29 @@\n rrectly%3Cbr%3E%0A\n+%3Cbr%3E%0A\n let bag = Di\n@@ -5109,32 +5109,42 @@\n eBag()%3Cbr%3E%0A%3Cbr%3E%0A\n+%3Cbr%3E%0A%3Cbr%3E%0A\n // Creating an O\n@@ -5188,24 +5188,29 @@\n g value%3Cbr%3E%0A\n+%3Cbr%3E%0A\n let observab\n@@ -5244,32 +5244,42 @@\n  Rx!%22)%3Cbr%3E%0A%3Cbr%3E%0A\n+%3Cbr%3E%0A%3Cbr%3E%0A\n // Creating a su\n@@ -5310,24 +5310,29 @@\n  events%3Cbr%3E%0A\n+%3Cbr%3E%0A\n let subscrip\n@@ -5370,24 +5370,29 @@\n Next:%7B %3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -5404,32 +5404,37 @@\n p;print($0)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3Cbr%3E%0A// A\n@@ -5429,16 +5429,26 @@\n r%3E%0A%3Cbr%3E%0A\n+%3Cbr%3E%0A%3Cbr%3E%0A\n // Addin\n@@ -5487,16 +5487,21 @@\n Bag%3Cbr%3E%0A\n+%3Cbr%3E%0A\n subscrip\n@@ -7307,16 +7307,21 @@\n g()%3Cbr%3E%0A\n+%3Cbr%3E%0A\n var publ\n@@ -7625,32 +7625,37 @@\n xt(%22Hello%22)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n publishSubject.o\n@@ -8184,32 +8184,37 @@\n be(onNext:%7B%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;print($0)\n@@ -8218,16 +8218,21 @@\n $0)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D).addDi\n@@ -8260,32 +8260,42 @@\n trong%3E%3Cbr%3E%0A%3Cbr%3E%0A\n+%3Cbr%3E%0A%3Cbr%3E%0A\n %3C/strong%3E%3C/em%3E//\n@@ -8355,32 +8355,42 @@\n  won't%3Cbr%3E%0A%3Cbr%3E%0A\n+%3Cbr%3E%0A%3Cbr%3E%0A\n publishSubject.o\n@@ -8404,24 +8404,29 @@\n Hello%22)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n publishSubje\n@@ -8458,16 +8458,31 @@\n r%3E%0A%3Cbr%3E%0A\n+%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n // Sub2 \n@@ -8542,24 +8542,29 @@\n d later%3Cbr%3E%0A\n+%3Cbr%3E%0A\n let subscrip\n@@ -8601,32 +8601,37 @@\n be(onNext:%7B%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;print(#li\n@@ -8633,32 +8633,37 @@\n t(#line,$0)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3Cbr%3E%0Apubl\n@@ -8650,32 +8650,42 @@\n br%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%3Cbr%3E%0A%3Cbr%3E%0A\n publishSubject.o\n@@ -10995,24 +10995,29 @@\n lue in %3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;retur\n@@ -11029,24 +11029,29 @@\n ue * 10%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D.subscribe(\n@@ -11059,24 +11059,29 @@\n nNext:%7B%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;print\n@@ -11081,39 +11081,49 @@\n p;print($0)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %3Cstrong%3EOUTPUT: \n@@ -11560,24 +11560,29 @@\n of(1,2)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n let sequence\n@@ -11611,32 +11611,42 @@\n f(1,2)%3Cbr%3E%0A%3Cbr%3E%0A\n+%3Cbr%3E%0A%3Cbr%3E%0A\n let sequenceOfSe\n@@ -11694,16 +11694,21 @@\n e2)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n sequence\n@@ -11755,32 +11755,37 @@\n be(onNext:%7B%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -11793,39 +11793,49 @@\n p;print($0)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %3Cstrong%3EOUTPUT: \n@@ -12057,24 +12057,29 @@\n alue in%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -12105,24 +12105,29 @@\n + value%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D.subscribe(\n@@ -12131,32 +12131,37 @@\n be(onNext:%7B%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -12177,23 +12177,33 @@\n $0)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n OUTPUT: \n@@ -12441,24 +12441,29 @@\n tervals%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -12551,24 +12551,29 @@\n uler:s)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -12631,32 +12631,37 @@\n be(onNext:%7B%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -12669,32 +12669,37 @@\n p;print($0)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E\n@@ -12691,32 +12691,47 @@\n )%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n+%3Cbr%3E%0A%3Cbr%3E%0A%3Cbr%3E%0A\n %3Cstrong%3EOUTPUT: \n@@ -13219,32 +13219,37 @@\n be(onNext:%7B%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -13269,39 +13269,49 @@\n p;print($0)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %3Cstrong%3EOUTPUT: \n@@ -13578,32 +13578,37 @@\n be(onNext:%7B%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -13616,39 +13616,49 @@\n p;print($0)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %3Cstrong%3EOUTPUT: \n@@ -14190,32 +14190,37 @@\n be(onNext:%7B%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -14236,23 +14236,33 @@\n $0)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %3Cstrong%3E\n@@ -14492,32 +14492,37 @@\n shSubject()%3Cbr%3E%0A\n+%3Cbr%3E%0A\n let publish2 = P\n@@ -14550,32 +14550,42 @@\n trong%3E%3Cbr%3E%0A%3Cbr%3E%0A\n+%3Cbr%3E%0A%3Cbr%3E%0A\n %3C/strong%3E%3C/em%3EOb\n@@ -14638,32 +14638,37 @@\n be(onNext:%7B%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -14676,32 +14676,37 @@\n p;print($0)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3Cbr%3E%0Apubl\n@@ -14693,32 +14693,42 @@\n br%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%3Cbr%3E%0A%3Cbr%3E%0A\n publish1.onNext(\n@@ -14727,32 +14727,37 @@\n .onNext(20)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n publish1.onNext(\n@@ -14760,24 +14760,29 @@\n ext(40)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n publish1.onN\n@@ -14789,24 +14789,29 @@\n ext(60)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n publish2.onN\n@@ -14817,24 +14817,29 @@\n Next(1)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n publish1.onN\n@@ -14846,24 +14846,29 @@\n ext(80)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n publish2.onN\n@@ -14874,24 +14874,29 @@\n Next(2)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n publish1.onN\n@@ -14904,24 +14904,29 @@\n xt(100)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %3Cstrong%3EOUTP\n@@ -15489,24 +15489,29 @@\n ,3,4,5)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n let b = Obse\n@@ -15542,24 +15542,34 @@\n %22)%3Cbr%3E%0A%3Cbr%3E%0A\n+%3Cbr%3E%0A%3Cbr%3E%0A\n Observable.z\n@@ -15606,24 +15606,29 @@\n cribe %7B%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -15648,22 +15648,32 @@\n $0)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %3Cstrong%3E\n@@ -16402,24 +16402,29 @@\n Next: %7B%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -16492,16 +16492,21 @@\n ion%3Cbr%3E%0A\n+%3Cbr%3E%0A\n *%7D).subs\n@@ -16516,32 +16516,37 @@\n be(onNext:%7B%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp;&nb\n@@ -16562,16 +16562,21 @@\n $0)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D)%3C/code\n@@ -18828,24 +18828,29 @@\n bject()%3Cbr%3E%0A\n+%3Cbr%3E%0A\n let publish2\n@@ -18874,24 +18874,34 @@\n ()%3Cbr%3E%0A%3Cbr%3E%0A\n+%3Cbr%3E%0A%3Cbr%3E%0A\n let concurre\n@@ -18965,24 +18965,29 @@\n ground)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n Observable.o\n@@ -19007,24 +19007,29 @@\n blish2)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -19103,24 +19103,29 @@\n eduler)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -19176,24 +19176,29 @@\n merge()%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -19270,24 +19270,29 @@\n uler())%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -19354,24 +19354,29 @@\n nNext:%7B%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  &nbsp;&nbsp\n@@ -19392,24 +19392,29 @@\n int($0)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %7D)%3Cbr%3E%0A%3Cbr%3E%0A\n@@ -19405,32 +19405,42 @@\n br%3E%0A%7D)%3Cbr%3E%0A%3Cbr%3E%0A\n+%3Cbr%3E%0A%3Cbr%3E%0A\n publish1.onNext(\n@@ -19443,24 +19443,29 @@\n ext(20)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n publish1.onN\n@@ -19472,24 +19472,29 @@\n ext(40)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %3Cstrong%3EOUTP\n",
      "json_metadata": "{\"tags\":[\"programming\",\"rxswift\",\"ios\",\"swift\"],\"links\":[\"https://developer.apple.com/reference/swift/sequence\",\"https://github.com/SebastianBoldt/Learn-and-Master-RxSwift\",\"http://rxmarbles.com/\",\"https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8\",\"https://goo.gl/b5YD8Kcontent_copy\",\"https://github.com/SebastianBoldt\",\"https://twitter.com/sebastianboldt\",\"https://de.linkedin.com/in/sebastian-boldt-9b465261\",\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\",\"https://soundcloud.com/sebastian_boldt\",\"https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md\",\"http://reactivex.io/documentation/operators.html\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://cdn-images-1.medium.com/max/4000/1*iVjIzql9k7PpwEUdb0phwQ.png\"]}"
    }
  ]
}
2017/11/10 18:03:24
parent author
parent permlinkprogramming
authorsebastianboldt
permlink7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
titleMy iOS Development Toolkit 2017
body@@ -1412,36 +1412,24 @@ # Tools%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* Continu @@ -1695,36 +1695,24 @@ tools.%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* I use %5B @@ -2146,36 +2146,24 @@ ***APIs%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* Find me @@ -2328,36 +2328,24 @@ html)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Jazz @@ -2461,36 +2461,24 @@ ctive-C%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* If you @@ -2571,36 +2571,24 @@ .com)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* When wo @@ -2669,36 +2669,24 @@ *Xcode*%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* A great @@ -2753,36 +2753,24 @@ z.io)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* Access @@ -2869,36 +2869,24 @@ .com)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Coco @@ -2967,36 +2967,24 @@ S* Apps%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Cart @@ -3089,36 +3089,24 @@ r Cocoa%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* If you @@ -3200,36 +3200,24 @@ .com)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* Improve @@ -3325,36 +3325,24 @@ isel)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* Turn dr @@ -3409,36 +3409,24 @@ .com)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Icon @@ -3512,36 +3512,24 @@ client%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Pixe @@ -3628,36 +3628,24 @@ Mac OS%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Powe @@ -3756,36 +3756,24 @@ * Files%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* With ** @@ -3849,36 +3849,24 @@ colors.%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Kap%5D @@ -3947,36 +3947,24 @@ hnology%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* I use %5B @@ -4056,36 +4056,24 @@ r read.%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**CCMe @@ -4291,36 +4291,24 @@ braries%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Awes @@ -4415,36 +4415,24 @@ tegory.%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* Network @@ -4506,36 +4506,24 @@ king)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* Network @@ -4607,36 +4607,24 @@ fire)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Prom @@ -4715,36 +4715,24 @@ bjects.%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Jell @@ -4851,36 +4851,24 @@ of code%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Audi @@ -4960,36 +4960,24 @@ amework%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**FBTw @@ -5071,36 +5071,24 @@ Runtime%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* Branchi @@ -5203,36 +5203,24 @@ ows/)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Real @@ -5294,36 +5294,24 @@ rnative%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* Get str @@ -5452,36 +5452,24 @@ wift)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* Visuali @@ -5607,36 +5607,24 @@ izer)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Swif @@ -5802,36 +5802,24 @@ laneous%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Term @@ -5983,36 +5983,24 @@ ebsites%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Ray @@ -6092,36 +6092,24 @@ torials%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* Books, @@ -6166,36 +6166,24 @@ c.io)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**NSHi @@ -6299,36 +6299,24 @@ weekly.%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* Weekly @@ -6411,36 +6411,24 @@ odes)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* A state @@ -6518,36 +6518,24 @@ .com)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* Create @@ -6627,36 +6627,24 @@ e.io)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Pttr @@ -6731,36 +6731,24 @@ ration.%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* You can @@ -6839,36 +6839,24 @@ ools)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Coco @@ -6971,36 +6971,24 @@ d OS X.%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* You can @@ -7054,36 +7054,24 @@ t.io)**%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* Great b @@ -7159,36 +7159,24 @@ odcasts%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**Core @@ -7306,36 +7306,24 @@ logies.%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* %5B**iPhr @@ -7445,28 +7445,16 @@ OS.%3C/p%3E%0A -%3Cp%3E%3Cbr%3E%3C/p%3E%0A %3Cp%3E* Gre
json metadata{"tags":["programming","ios","cocoa","swift"],"links":["https://get.fabric.io","https://developer.apple.com/testflight/","https://smooch.io","https://mixpanel.com","https://trello.com","https://www.google.de/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwiew4HR493LAhWsIpoKHRa1Dl4QFggpMAA&amp;url=https%3A%2F%2Fde.atlassian.com%2Fsoftware%2Fjira&amp;usg=AFQjCNG7Qw8fibiPjAvoxyU83uCs4lUEJQ&amp;sig2=4VlRGoUgjj2bwQSc3jg0KQ","https://en.wikipedia.org/wiki/Scrum_%28software_development%29","https://www.atlassian.com/git/tutorials/comparing-workflows/","https://fastlane.tools","https://luckymarmot.com/de/paw","https://www.google.de/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwjS1KvAnMDMAhUBJMAKHXclCG8QFggdMAA&amp;url=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Fpostman%2Ffhbjgbiflinjbdggehcddcbncdddomop&amp;usg=AFQjCNEKwgqPDcgrMAsS6iZ8PUYhTzB58A&amp;sig2=IBr-c8l-FnJjzwP0tBaAOA","https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html","https://github.com/realm/jazzy","https://www.sourcetreeapp.com","https://atom.io","http://alcatraz.io","https://simpholders.com","https://cocoapods.org","https://github.com/Carthage/Carthage","https://www.charlesproxy.com","https://github.com/facebook/chisel","http://www.paintcodeapp.com","https://icons8.com","http://www.pixelmator.com/mac/","https://tickplant.com/powerjsoneditor/","http://sipapp.io","https://getkap.co","https://getpocket.com","https://itunes.apple.com/de/app/ccmenu/id603117688?mt=12","https://github.com/vsouza/awesome-ios","http://AFNetworking","https://github.com/Alamofire/Alamofire","http://promisekit.org","https://github.com/SebastianBoldt/Jelly","http://audiokit.io","https://github.com/facebook/Tweaks","https://realm.io/docs/swift/latest/","https://github.com/mac-cain13/R.swift","https://github.com/conopsys/COSTouchVisualizer","https://github.com/realm/SwiftLint","https://github.com/SebastianBoldt/Terminal-Cheatsheet","https://www.raywenderlich.com","https://www.objc.io","http://nshipster.com","http://nsscreencast.com/episodes","https://www.natashatherobot.com","https://www.gitignore.io","http://pttrns.com","https://iosdev.tools","https://www.cocoacontrols.com","http://nshint.io","http://khanlou.com","http://www.coreint.org","https://devchat.tv/iphreaks/","https://www.raywenderlich.com/rwpodcast","https://github.com/SebastianBoldt","https://twitter.com/sebastianboldt","https://de.linkedin.com/in/sebastian-boldt-9b465261","https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p","https://soundcloud.com/sebastian_boldt"],"app":"steemit/0.1","format":"html","image":["https://cdn-images-1.medium.com/max/4000/1*i3SuhBo3VEC8G79ee1CQ5w.jpeg"]}
Transaction InfoBlock #17106215/Trx 7b75baa2747d80953a056dc4b4c75fb23bfc6a8d
View Raw JSON Data
{
  "trx_id": "7b75baa2747d80953a056dc4b4c75fb23bfc6a8d",
  "block": 17106215,
  "trx_in_block": 17,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T18:03:24",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "programming",
      "author": "sebastianboldt",
      "permlink": "7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "title": "My iOS Development Toolkit 2017",
      "body": "@@ -1412,36 +1412,24 @@\n # Tools%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* Continu\n@@ -1695,36 +1695,24 @@\n  tools.%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* I use %5B\n@@ -2146,36 +2146,24 @@\n ***APIs%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* Find me\n@@ -2328,36 +2328,24 @@\n html)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Jazz\n@@ -2461,36 +2461,24 @@\n ctive-C%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* If you \n@@ -2571,36 +2571,24 @@\n .com)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* When wo\n@@ -2669,36 +2669,24 @@\n *Xcode*%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* A great\n@@ -2753,36 +2753,24 @@\n z.io)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* Access \n@@ -2869,36 +2869,24 @@\n .com)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Coco\n@@ -2967,36 +2967,24 @@\n S* Apps%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Cart\n@@ -3089,36 +3089,24 @@\n r Cocoa%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* If you \n@@ -3200,36 +3200,24 @@\n .com)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* Improve\n@@ -3325,36 +3325,24 @@\n isel)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* Turn dr\n@@ -3409,36 +3409,24 @@\n .com)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Icon\n@@ -3512,36 +3512,24 @@\n  client%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Pixe\n@@ -3628,36 +3628,24 @@\n  Mac OS%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Powe\n@@ -3756,36 +3756,24 @@\n * Files%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* With **\n@@ -3849,36 +3849,24 @@\n colors.%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Kap%5D\n@@ -3947,36 +3947,24 @@\n hnology%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* I use %5B\n@@ -4056,36 +4056,24 @@\n r read.%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**CCMe\n@@ -4291,36 +4291,24 @@\n braries%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Awes\n@@ -4415,36 +4415,24 @@\n tegory.%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* Network\n@@ -4506,36 +4506,24 @@\n king)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* Network\n@@ -4607,36 +4607,24 @@\n fire)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Prom\n@@ -4715,36 +4715,24 @@\n bjects.%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Jell\n@@ -4851,36 +4851,24 @@\n of code%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Audi\n@@ -4960,36 +4960,24 @@\n amework%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**FBTw\n@@ -5071,36 +5071,24 @@\n Runtime%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* Branchi\n@@ -5203,36 +5203,24 @@\n ows/)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Real\n@@ -5294,36 +5294,24 @@\n rnative%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* Get str\n@@ -5452,36 +5452,24 @@\n wift)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* Visuali\n@@ -5607,36 +5607,24 @@\n izer)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Swif\n@@ -5802,36 +5802,24 @@\n laneous%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Term\n@@ -5983,36 +5983,24 @@\n ebsites%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Ray \n@@ -6092,36 +6092,24 @@\n torials%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* Books, \n@@ -6166,36 +6166,24 @@\n c.io)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**NSHi\n@@ -6299,36 +6299,24 @@\n weekly.%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* Weekly \n@@ -6411,36 +6411,24 @@\n odes)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* A state\n@@ -6518,36 +6518,24 @@\n .com)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* Create \n@@ -6627,36 +6627,24 @@\n e.io)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Pttr\n@@ -6731,36 +6731,24 @@\n ration.%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* You can\n@@ -6839,36 +6839,24 @@\n ools)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Coco\n@@ -6971,36 +6971,24 @@\n d OS X.%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* You can\n@@ -7054,36 +7054,24 @@\n t.io)**%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* Great b\n@@ -7159,36 +7159,24 @@\n odcasts%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**Core\n@@ -7306,36 +7306,24 @@\n logies.%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* %5B**iPhr\n@@ -7445,28 +7445,16 @@\n OS.%3C/p%3E%0A\n-%3Cp%3E%3Cbr%3E%3C/p%3E%0A\n %3Cp%3E* Gre\n",
      "json_metadata": "{\"tags\":[\"programming\",\"ios\",\"cocoa\",\"swift\"],\"links\":[\"https://get.fabric.io\",\"https://developer.apple.com/testflight/\",\"https://smooch.io\",\"https://mixpanel.com\",\"https://trello.com\",\"https://www.google.de/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwiew4HR493LAhWsIpoKHRa1Dl4QFggpMAA&amp;url=https%3A%2F%2Fde.atlassian.com%2Fsoftware%2Fjira&amp;usg=AFQjCNG7Qw8fibiPjAvoxyU83uCs4lUEJQ&amp;sig2=4VlRGoUgjj2bwQSc3jg0KQ\",\"https://en.wikipedia.org/wiki/Scrum_%28software_development%29\",\"https://www.atlassian.com/git/tutorials/comparing-workflows/\",\"https://fastlane.tools\",\"https://luckymarmot.com/de/paw\",\"https://www.google.de/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwjS1KvAnMDMAhUBJMAKHXclCG8QFggdMAA&amp;url=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Fpostman%2Ffhbjgbiflinjbdggehcddcbncdddomop&amp;usg=AFQjCNEKwgqPDcgrMAsS6iZ8PUYhTzB58A&amp;sig2=IBr-c8l-FnJjzwP0tBaAOA\",\"https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html\",\"https://github.com/realm/jazzy\",\"https://www.sourcetreeapp.com\",\"https://atom.io\",\"http://alcatraz.io\",\"https://simpholders.com\",\"https://cocoapods.org\",\"https://github.com/Carthage/Carthage\",\"https://www.charlesproxy.com\",\"https://github.com/facebook/chisel\",\"http://www.paintcodeapp.com\",\"https://icons8.com\",\"http://www.pixelmator.com/mac/\",\"https://tickplant.com/powerjsoneditor/\",\"http://sipapp.io\",\"https://getkap.co\",\"https://getpocket.com\",\"https://itunes.apple.com/de/app/ccmenu/id603117688?mt=12\",\"https://github.com/vsouza/awesome-ios\",\"http://AFNetworking\",\"https://github.com/Alamofire/Alamofire\",\"http://promisekit.org\",\"https://github.com/SebastianBoldt/Jelly\",\"http://audiokit.io\",\"https://github.com/facebook/Tweaks\",\"https://realm.io/docs/swift/latest/\",\"https://github.com/mac-cain13/R.swift\",\"https://github.com/conopsys/COSTouchVisualizer\",\"https://github.com/realm/SwiftLint\",\"https://github.com/SebastianBoldt/Terminal-Cheatsheet\",\"https://www.raywenderlich.com\",\"https://www.objc.io\",\"http://nshipster.com\",\"http://nsscreencast.com/episodes\",\"https://www.natashatherobot.com\",\"https://www.gitignore.io\",\"http://pttrns.com\",\"https://iosdev.tools\",\"https://www.cocoacontrols.com\",\"http://nshint.io\",\"http://khanlou.com\",\"http://www.coreint.org\",\"https://devchat.tv/iphreaks/\",\"https://www.raywenderlich.com/rwpodcast\",\"https://github.com/SebastianBoldt\",\"https://twitter.com/sebastianboldt\",\"https://de.linkedin.com/in/sebastian-boldt-9b465261\",\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\",\"https://soundcloud.com/sebastian_boldt\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://cdn-images-1.medium.com/max/4000/1*i3SuhBo3VEC8G79ee1CQ5w.jpeg\"]}"
    }
  ]
}
2017/11/10 18:01:45
parent author
parent permlinkprogramming
authorsebastianboldt
permlink7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
titleMy iOS Development Toolkit 2017
body<html> <p><br></p> <p>## My iOS Development Toolkit 2017</p> <p>Last Update 27.02.2017</p> <p><br></p> <p>![](https://cdn-images-1.medium.com/max/4000/1*i3SuhBo3VEC8G79ee1CQ5w.jpeg)</p> <p><br></p> <p>This is a curated list of iOS Development Tools, Websites, Services and Frameworks I am currently using.</p> <p>### Services</p> <p>* A modular plugin system for your iOS Apps called [**Fabric](https://get.fabric.io)**</p> <p>* [**Testflight](https://developer.apple.com/testflight/) **is a native beta test distribution framework</p> <p>* [**Smooch](https://smooch.io) **is a great messaging SDK I am currently using to get direct feedback from my users.</p> <p>* Mobile Analytics with [**Mixpanel](https://mixpanel.com)**</p> <p>* I use [**Trello](https://trello.com)** to manage my private projects</p> <p>* When working in a Team, I prefer using a tool like [**JIRA](https://www.google.de/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwiew4HR493LAhWsIpoKHRa1Dl4QFggpMAA&amp;url=https%3A%2F%2Fde.atlassian.com%2Fsoftware%2Fjira&amp;usg=AFQjCNG7Qw8fibiPjAvoxyU83uCs4lUEJQ&amp;sig2=4VlRGoUgjj2bwQSc3jg0KQ) **directly connected with the Repository** **in conjunction with** [SCRUM](https://en.wikipedia.org/wiki/Scrum_%28software_development%29) **and **[Gitflow Workflow](https://www.atlassian.com/git/tutorials/comparing-workflows/)**</p> <p><br></p> <p>### Tools</p> <p><br></p> <p>* Continuous Delivery made easy using [**Fastlane](https://fastlane.tools). **It automatically builds, tests, signs and uploads your App to iTunes Connect, Hockey etc.. There are a lot more things to discover. Check out their Docs to learn more about all the available tools.</p> <p><br></p> <p>* I use [**PAW](https://luckymarmot.com/de/paw) or [Postman](https://www.google.de/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwjS1KvAnMDMAhUBJMAKHXclCG8QFggdMAA&amp;url=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Fpostman%2Ffhbjgbiflinjbdggehcddcbncdddomop&amp;usg=AFQjCNEKwgqPDcgrMAsS6iZ8PUYhTzB58A&amp;sig2=IBr-c8l-FnJjzwP0tBaAOA) **for testing and documenting RESTful ****APIs</p> <p><br></p> <p>* Find memory leaks and much more using [**Instruments](https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html)**</p> <p><br></p> <p>* [**Jazzy](https://github.com/realm/jazzy)** is a command-line utility that generates documentation for Swift or Objective-C</p> <p><br></p> <p>* If you are using **GIT **I can ****highly recommend [**Source Tree](https://www.sourcetreeapp.com)**</p> <p><br></p> <p>* When working with Ruby or Python I prefer using [**Atom](https://atom.io) **over *Xcode*</p> <p><br></p> <p>* A great Plugin Manager for Xcode called [**Alcatraz](http://alcatraz.io)**</p> <p><br></p> <p>* Access simulators application directory from your menu bar with [**SimPholders](https://simpholders.com)**</p> <p><br></p> <p>* [**Cocoa Pods](https://cocoapods.org)** is a dependency management system for *iOS* Apps</p> <p><br></p> <p>* [**Carthage](https://github.com/Carthage/Carthage) **is a** **simple, decentralized dependency manager for Cocoa</p> <p><br></p> <p>* If you want to sniff *HTTP-*Request from your iDevice use [**Charles](https://www.charlesproxy.com)**</p> <p><br></p> <p>* Improve your Debugging with a collection of *LLDB* commands called [**Chisel](https://github.com/facebook/chisel)**</p> <p><br></p> <p>* Turn drawings into code with [**Paint Code](http://www.paintcodeapp.com)**</p> <p><br></p> <p>* [**Icons8 App](https://icons8.com)** provides 23,400 Free Icons through a nice desktop client</p> <p><br></p> <p>* [**Pixelmator](http://www.pixelmator.com/mac/) **is a** **great low price Photoshop alternative for Mac OS</p> <p><br></p> <p>* [**Power JSON Editor](https://tickplant.com/powerjsoneditor/)** is a great tool to edit and overview your *JSON* Files</p> <p><br></p> <p>* With **[Sip](http://sipapp.io)** you can collect, organize &amp; share your colors.</p> <p><br></p> <p>* [**Kap](https://getkap.co)** is an open-source screen recorder built with web technology</p> <p><br></p> <p>* I use [**Pocket](https://getpocket.com)** across all my devices to store Articles for a later read.</p> <p><br></p> <p>* [**CCMenu](https://itunes.apple.com/de/app/ccmenu/id603117688?mt=12)** displays the build status of projects on a continuous integration server as an item in the Mac’s menu bar.</p> <p><br></p> <p>### Frameworks and Libraries</p> <p><br></p> <p>* [**Awesome-iOS](https://github.com/vsouza/awesome-ios)** is a curated list of useful Libraries sorted by category.</p> <p><br></p> <p>* Networking in Objective-C made easy using [**AFNetworking](http://AFNetworking)**</p> <p><br></p> <p>* Networking in Swift made easy using [**Alamofire](https://github.com/Alamofire/Alamofire)**</p> <p><br></p> <p>* [**PromiseKit](http://promisekit.org)** make asynchronous operations composable, flexible objects.</p> <p><br></p> <p>* [**Jelly](https://github.com/SebastianBoldt/Jelly)** provides custom view controller transitions with just a few lines of code</p> <p><br></p> <p>* [**AudioKit](http://audiokit.io)** is a powerful audio synthesis, processing and analysis framework</p> <p><br></p> <p>* [**FBTweaks](https://github.com/facebook/Tweaks)** is a great way to manipulate parameters at Runtime</p> <p><br></p> <p>* Branching approach for Git ****called **[Gitflow Workflow](https://www.atlassian.com/git/tutorials/comparing-workflows/)**</p> <p><br></p> <p>* [**Realm](https://realm.io/docs/swift/latest/) **is a great Core Data alternative</p> <p><br></p> <p>* Get strong typed, autocompleted resources like images, fonts and segues in Swift projects using [**R.swift](https://github.com/mac-cain13/R.swift)**</p> <p><br></p> <p>* Visualize touches, gestures and long presses on your iPhone or iPad with [**COSTouchVisualizer](https://github.com/conopsys/COSTouchVisualizer)**</p> <p><br></p> <p>* [**SwiftLint](https://github.com/realm/SwiftLint)** is a tool that enforces Swift style and conventions as errors and warnings directly inside Xcode</p> <p><br></p> <p>### Miscellaneous</p> <p><br></p> <p>* [**Terminal Cheat-Sheet **](https://github.com/SebastianBoldt/Terminal-Cheatsheet)My personal cheat sheet for the Mac OS Terminal</p> <p><br></p> <p>### Blogs and Websites</p> <p><br></p> <p>* [**Ray Wenderlich](https://www.raywenderlich.com) **provides** **high-quality programming tutorials</p> <p><br></p> <p>* Books, Talks and Tutorials on **[Objc.io](https://www.objc.io)**</p> <p><br></p> <p>* [**NSHipster](http://nshipster.com) **is a journal of the overlooked bits in Objective-C, Swift, and Cocoa. Updated weekly.</p> <p><br></p> <p>* Weekly bite-sized screencasts on iOS development. [**NSScreencast](http://nsscreencast.com/episodes)**</p> <p><br></p> <p>* A state of the art developer blog called **[Natasha the Robot](https://www.natashatherobot.com)**</p> <p><br></p> <p>* Create useful .**gitignore** files for your project on [**gitignore.io](https://www.gitignore.io)**</p> <p><br></p> <p>* [**Pttrns](http://pttrns.com) **is a collection of design patterns, resources and inspiration.</p> <p><br></p> <p>* You can find a great list of iOS Tools &amp; Resources on [**iOSDev.tools](https://iosdev.tools)**</p> <p><br></p> <p>* [**Cocoa Controls](https://www.cocoacontrols.com)** provides 4200 open source UI components&nbsp;</p> <p>for iOS and OS X.</p> <p><br></p> <p>* You can find short and factful articles on **[NSHint](http://nshint.io)**</p> <p><br></p> <p>* Great blog around iOS and co. [**khanlou](http://khanlou.com)**</p> <p><br></p> <p>### Podcasts</p> <p><br></p> <p>* [**Core Intuition](http://www.coreint.org)** is a podcast about indie software development for the Mac, iOS and other Apple technologies.</p> <p><br></p> <p>* [**iPhreaks](https://devchat.tv/iphreaks/)** provides weekly panel discussions about the ins and outs of programming for iOS.</p> <p><br></p> <p>* Great App Development Podcast **[The RayWenderlich.com Podcast](https://www.raywenderlich.com/rwpodcast)**</p> <p><br></p> <p>Feel free to add me on [**github](https://github.com/SebastianBoldt)**, [**twitter](https://twitter.com/sebastianboldt), [linkedin](https://de.linkedin.com/in/sebastian-boldt-9b465261) **or **[xing](https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p) **if you have any questions. If you like electronic music you can also listen to my Tracks on [**SoundCloud](https://soundcloud.com/sebastian_boldt)** ;)</p> <p>[**SebastianBoldt (Sebastian Boldt)**</p> <p>*SebastianBoldt has 4 repositories available. Follow their code on GitHub.*github.com](https://github.com/SebastianBoldt)</p> <p>Ciao!</p> <p>Sebastian Boldt</p> <p><br></p> </html>
json metadata{"tags":["programming","ios","cocoa","swift"],"links":["https://get.fabric.io","https://developer.apple.com/testflight/","https://smooch.io","https://mixpanel.com","https://trello.com","https://www.google.de/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwiew4HR493LAhWsIpoKHRa1Dl4QFggpMAA&amp;url=https%3A%2F%2Fde.atlassian.com%2Fsoftware%2Fjira&amp;usg=AFQjCNG7Qw8fibiPjAvoxyU83uCs4lUEJQ&amp;sig2=4VlRGoUgjj2bwQSc3jg0KQ","https://en.wikipedia.org/wiki/Scrum_%28software_development%29","https://www.atlassian.com/git/tutorials/comparing-workflows/","https://fastlane.tools","https://luckymarmot.com/de/paw","https://www.google.de/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwjS1KvAnMDMAhUBJMAKHXclCG8QFggdMAA&amp;url=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Fpostman%2Ffhbjgbiflinjbdggehcddcbncdddomop&amp;usg=AFQjCNEKwgqPDcgrMAsS6iZ8PUYhTzB58A&amp;sig2=IBr-c8l-FnJjzwP0tBaAOA","https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html","https://github.com/realm/jazzy","https://www.sourcetreeapp.com","https://atom.io","http://alcatraz.io","https://simpholders.com","https://cocoapods.org","https://github.com/Carthage/Carthage","https://www.charlesproxy.com","https://github.com/facebook/chisel","http://www.paintcodeapp.com","https://icons8.com","http://www.pixelmator.com/mac/","https://tickplant.com/powerjsoneditor/","http://sipapp.io","https://getkap.co","https://getpocket.com","https://itunes.apple.com/de/app/ccmenu/id603117688?mt=12","https://github.com/vsouza/awesome-ios","http://AFNetworking","https://github.com/Alamofire/Alamofire","http://promisekit.org","https://github.com/SebastianBoldt/Jelly","http://audiokit.io","https://github.com/facebook/Tweaks","https://realm.io/docs/swift/latest/","https://github.com/mac-cain13/R.swift","https://github.com/conopsys/COSTouchVisualizer","https://github.com/realm/SwiftLint","https://github.com/SebastianBoldt/Terminal-Cheatsheet","https://www.raywenderlich.com","https://www.objc.io","http://nshipster.com","http://nsscreencast.com/episodes","https://www.natashatherobot.com","https://www.gitignore.io","http://pttrns.com","https://iosdev.tools","https://www.cocoacontrols.com","http://nshint.io","http://khanlou.com","http://www.coreint.org","https://devchat.tv/iphreaks/","https://www.raywenderlich.com/rwpodcast","https://github.com/SebastianBoldt","https://twitter.com/sebastianboldt","https://de.linkedin.com/in/sebastian-boldt-9b465261","https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p","https://soundcloud.com/sebastian_boldt"],"app":"steemit/0.1","format":"html","image":["https://cdn-images-1.medium.com/max/4000/1*i3SuhBo3VEC8G79ee1CQ5w.jpeg"]}
Transaction InfoBlock #17106182/Trx 4a0297dc3cf1180c6e9ddf316b078c7e7a5e3266
View Raw JSON Data
{
  "trx_id": "4a0297dc3cf1180c6e9ddf316b078c7e7a5e3266",
  "block": 17106182,
  "trx_in_block": 18,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T18:01:45",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "programming",
      "author": "sebastianboldt",
      "permlink": "7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "title": "My iOS Development Toolkit 2017",
      "body": "<html>\n<p><br></p>\n<p>## My iOS Development Toolkit 2017</p>\n<p>Last Update 27.02.2017</p>\n<p><br></p>\n<p>![](https://cdn-images-1.medium.com/max/4000/1*i3SuhBo3VEC8G79ee1CQ5w.jpeg)</p>\n<p><br></p>\n<p>This is a curated list of iOS Development Tools, Websites, Services and Frameworks I am currently using.</p>\n<p>### Services</p>\n<p>* A modular plugin system for your iOS Apps called [**Fabric](https://get.fabric.io)**</p>\n<p>* [**Testflight](https://developer.apple.com/testflight/) **is a native beta test distribution framework</p>\n<p>* [**Smooch](https://smooch.io) **is a great messaging SDK I am currently using to get direct feedback from my users.</p>\n<p>* Mobile Analytics with [**Mixpanel](https://mixpanel.com)**</p>\n<p>* I use [**Trello](https://trello.com)** to manage my private projects</p>\n<p>* When working in a Team, I prefer using a tool like [**JIRA](https://www.google.de/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwiew4HR493LAhWsIpoKHRa1Dl4QFggpMAA&amp;url=https%3A%2F%2Fde.atlassian.com%2Fsoftware%2Fjira&amp;usg=AFQjCNG7Qw8fibiPjAvoxyU83uCs4lUEJQ&amp;sig2=4VlRGoUgjj2bwQSc3jg0KQ) **directly connected with the Repository** **in conjunction with** [SCRUM](https://en.wikipedia.org/wiki/Scrum_%28software_development%29) **and **[Gitflow Workflow](https://www.atlassian.com/git/tutorials/comparing-workflows/)**</p>\n<p><br></p>\n<p>### Tools</p>\n<p><br></p>\n<p>* Continuous Delivery made easy using [**Fastlane](https://fastlane.tools). **It automatically builds, tests, signs and uploads your App to iTunes Connect, Hockey etc.. There are a lot more things to discover. Check out their Docs to learn more about all the available tools.</p>\n<p><br></p>\n<p>* I use [**PAW](https://luckymarmot.com/de/paw) or [Postman](https://www.google.de/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwjS1KvAnMDMAhUBJMAKHXclCG8QFggdMAA&amp;url=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Fpostman%2Ffhbjgbiflinjbdggehcddcbncdddomop&amp;usg=AFQjCNEKwgqPDcgrMAsS6iZ8PUYhTzB58A&amp;sig2=IBr-c8l-FnJjzwP0tBaAOA) **for testing and documenting RESTful ****APIs</p>\n<p><br></p>\n<p>* Find memory leaks and much more using [**Instruments](https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html)**</p>\n<p><br></p>\n<p>* [**Jazzy](https://github.com/realm/jazzy)** is a command-line utility that generates documentation for Swift or Objective-C</p>\n<p><br></p>\n<p>* If you are using **GIT **I can ****highly recommend [**Source Tree](https://www.sourcetreeapp.com)**</p>\n<p><br></p>\n<p>* When working with Ruby or Python I prefer using [**Atom](https://atom.io) **over *Xcode*</p>\n<p><br></p>\n<p>* A great Plugin Manager for Xcode called [**Alcatraz](http://alcatraz.io)**</p>\n<p><br></p>\n<p>* Access simulators application directory from your menu bar with [**SimPholders](https://simpholders.com)**</p>\n<p><br></p>\n<p>* [**Cocoa Pods](https://cocoapods.org)** is a dependency management system for *iOS* Apps</p>\n<p><br></p>\n<p>* [**Carthage](https://github.com/Carthage/Carthage) **is a** **simple, decentralized dependency manager for Cocoa</p>\n<p><br></p>\n<p>* If you want to sniff *HTTP-*Request from your iDevice use [**Charles](https://www.charlesproxy.com)**</p>\n<p><br></p>\n<p>* Improve your Debugging with a collection of *LLDB* commands called [**Chisel](https://github.com/facebook/chisel)**</p>\n<p><br></p>\n<p>* Turn drawings into code with [**Paint Code](http://www.paintcodeapp.com)**</p>\n<p><br></p>\n<p>* [**Icons8 App](https://icons8.com)** provides 23,400 Free Icons through a nice desktop client</p>\n<p><br></p>\n<p>* [**Pixelmator](http://www.pixelmator.com/mac/) **is a** **great low price Photoshop alternative for Mac OS</p>\n<p><br></p>\n<p>* [**Power JSON Editor](https://tickplant.com/powerjsoneditor/)** is a great tool to edit and overview your *JSON* Files</p>\n<p><br></p>\n<p>* With **[Sip](http://sipapp.io)** you can collect, organize &amp; share your colors.</p>\n<p><br></p>\n<p>* [**Kap](https://getkap.co)** is an open-source screen recorder built with web technology</p>\n<p><br></p>\n<p>* I use [**Pocket](https://getpocket.com)** across all my devices to store Articles for a later read.</p>\n<p><br></p>\n<p>* [**CCMenu](https://itunes.apple.com/de/app/ccmenu/id603117688?mt=12)** displays the build status of projects on a continuous integration server as an item in the Mac’s menu bar.</p>\n<p><br></p>\n<p>### Frameworks and Libraries</p>\n<p><br></p>\n<p>* [**Awesome-iOS](https://github.com/vsouza/awesome-ios)** is a curated list of useful Libraries sorted by category.</p>\n<p><br></p>\n<p>* Networking in Objective-C made easy using [**AFNetworking](http://AFNetworking)**</p>\n<p><br></p>\n<p>* Networking in Swift made easy using [**Alamofire](https://github.com/Alamofire/Alamofire)**</p>\n<p><br></p>\n<p>* [**PromiseKit](http://promisekit.org)** make asynchronous operations composable, flexible objects.</p>\n<p><br></p>\n<p>* [**Jelly](https://github.com/SebastianBoldt/Jelly)** provides custom view controller transitions with just a few lines of code</p>\n<p><br></p>\n<p>* [**AudioKit](http://audiokit.io)** is a powerful audio synthesis, processing and analysis framework</p>\n<p><br></p>\n<p>* [**FBTweaks](https://github.com/facebook/Tweaks)** is a great way to manipulate parameters at Runtime</p>\n<p><br></p>\n<p>* Branching approach for Git ****called **[Gitflow Workflow](https://www.atlassian.com/git/tutorials/comparing-workflows/)**</p>\n<p><br></p>\n<p>* [**Realm](https://realm.io/docs/swift/latest/) **is a great Core Data alternative</p>\n<p><br></p>\n<p>* Get strong typed, autocompleted resources like images, fonts and segues in Swift projects using [**R.swift](https://github.com/mac-cain13/R.swift)**</p>\n<p><br></p>\n<p>* Visualize touches, gestures and long presses on your iPhone or iPad with [**COSTouchVisualizer](https://github.com/conopsys/COSTouchVisualizer)**</p>\n<p><br></p>\n<p>* [**SwiftLint](https://github.com/realm/SwiftLint)** is a tool that enforces Swift style and conventions as errors and warnings directly inside Xcode</p>\n<p><br></p>\n<p>### Miscellaneous</p>\n<p><br></p>\n<p>* [**Terminal Cheat-Sheet **](https://github.com/SebastianBoldt/Terminal-Cheatsheet)My personal cheat sheet for the Mac OS Terminal</p>\n<p><br></p>\n<p>### Blogs and Websites</p>\n<p><br></p>\n<p>* [**Ray Wenderlich](https://www.raywenderlich.com) **provides** **high-quality programming tutorials</p>\n<p><br></p>\n<p>* Books, Talks and Tutorials on **[Objc.io](https://www.objc.io)**</p>\n<p><br></p>\n<p>* [**NSHipster](http://nshipster.com) **is a journal of the overlooked bits in Objective-C, Swift, and Cocoa. Updated weekly.</p>\n<p><br></p>\n<p>* Weekly bite-sized screencasts on iOS development. [**NSScreencast](http://nsscreencast.com/episodes)**</p>\n<p><br></p>\n<p>* A state of the art developer blog called **[Natasha the Robot](https://www.natashatherobot.com)**</p>\n<p><br></p>\n<p>* Create useful .**gitignore** files for your project on [**gitignore.io](https://www.gitignore.io)**</p>\n<p><br></p>\n<p>* [**Pttrns](http://pttrns.com) **is a collection of design patterns, resources and inspiration.</p>\n<p><br></p>\n<p>* You can find a great list of iOS Tools &amp; Resources on [**iOSDev.tools](https://iosdev.tools)**</p>\n<p><br></p>\n<p>* [**Cocoa Controls](https://www.cocoacontrols.com)** provides 4200 open source UI components&nbsp;</p>\n<p>for iOS and OS X.</p>\n<p><br></p>\n<p>* You can find short and factful articles on **[NSHint](http://nshint.io)**</p>\n<p><br></p>\n<p>* Great blog around iOS and co. [**khanlou](http://khanlou.com)**</p>\n<p><br></p>\n<p>### Podcasts</p>\n<p><br></p>\n<p>* [**Core Intuition](http://www.coreint.org)** is a podcast about indie software development for the Mac, iOS and other Apple technologies.</p>\n<p><br></p>\n<p>* [**iPhreaks](https://devchat.tv/iphreaks/)** provides weekly panel discussions about the ins and outs of programming for iOS.</p>\n<p><br></p>\n<p>* Great App Development Podcast **[The RayWenderlich.com Podcast](https://www.raywenderlich.com/rwpodcast)**</p>\n<p><br></p>\n<p>Feel free to add me on [**github](https://github.com/SebastianBoldt)**, [**twitter](https://twitter.com/sebastianboldt), [linkedin](https://de.linkedin.com/in/sebastian-boldt-9b465261) **or **[xing](https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p) **if you have any questions. If you like electronic music you can also listen to my Tracks on [**SoundCloud](https://soundcloud.com/sebastian_boldt)** ;)</p>\n<p>[**SebastianBoldt (Sebastian Boldt)**</p>\n<p>*SebastianBoldt has 4 repositories available. Follow their code on GitHub.*github.com](https://github.com/SebastianBoldt)</p>\n<p>Ciao!</p>\n<p>Sebastian Boldt</p>\n<p><br></p>\n</html>",
      "json_metadata": "{\"tags\":[\"programming\",\"ios\",\"cocoa\",\"swift\"],\"links\":[\"https://get.fabric.io\",\"https://developer.apple.com/testflight/\",\"https://smooch.io\",\"https://mixpanel.com\",\"https://trello.com\",\"https://www.google.de/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwiew4HR493LAhWsIpoKHRa1Dl4QFggpMAA&amp;url=https%3A%2F%2Fde.atlassian.com%2Fsoftware%2Fjira&amp;usg=AFQjCNG7Qw8fibiPjAvoxyU83uCs4lUEJQ&amp;sig2=4VlRGoUgjj2bwQSc3jg0KQ\",\"https://en.wikipedia.org/wiki/Scrum_%28software_development%29\",\"https://www.atlassian.com/git/tutorials/comparing-workflows/\",\"https://fastlane.tools\",\"https://luckymarmot.com/de/paw\",\"https://www.google.de/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=1&amp;cad=rja&amp;uact=8&amp;ved=0ahUKEwjS1KvAnMDMAhUBJMAKHXclCG8QFggdMAA&amp;url=https%3A%2F%2Fchrome.google.com%2Fwebstore%2Fdetail%2Fpostman%2Ffhbjgbiflinjbdggehcddcbncdddomop&amp;usg=AFQjCNEKwgqPDcgrMAsS6iZ8PUYhTzB58A&amp;sig2=IBr-c8l-FnJjzwP0tBaAOA\",\"https://developer.apple.com/library/watchos/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/index.html\",\"https://github.com/realm/jazzy\",\"https://www.sourcetreeapp.com\",\"https://atom.io\",\"http://alcatraz.io\",\"https://simpholders.com\",\"https://cocoapods.org\",\"https://github.com/Carthage/Carthage\",\"https://www.charlesproxy.com\",\"https://github.com/facebook/chisel\",\"http://www.paintcodeapp.com\",\"https://icons8.com\",\"http://www.pixelmator.com/mac/\",\"https://tickplant.com/powerjsoneditor/\",\"http://sipapp.io\",\"https://getkap.co\",\"https://getpocket.com\",\"https://itunes.apple.com/de/app/ccmenu/id603117688?mt=12\",\"https://github.com/vsouza/awesome-ios\",\"http://AFNetworking\",\"https://github.com/Alamofire/Alamofire\",\"http://promisekit.org\",\"https://github.com/SebastianBoldt/Jelly\",\"http://audiokit.io\",\"https://github.com/facebook/Tweaks\",\"https://realm.io/docs/swift/latest/\",\"https://github.com/mac-cain13/R.swift\",\"https://github.com/conopsys/COSTouchVisualizer\",\"https://github.com/realm/SwiftLint\",\"https://github.com/SebastianBoldt/Terminal-Cheatsheet\",\"https://www.raywenderlich.com\",\"https://www.objc.io\",\"http://nshipster.com\",\"http://nsscreencast.com/episodes\",\"https://www.natashatherobot.com\",\"https://www.gitignore.io\",\"http://pttrns.com\",\"https://iosdev.tools\",\"https://www.cocoacontrols.com\",\"http://nshint.io\",\"http://khanlou.com\",\"http://www.coreint.org\",\"https://devchat.tv/iphreaks/\",\"https://www.raywenderlich.com/rwpodcast\",\"https://github.com/SebastianBoldt\",\"https://twitter.com/sebastianboldt\",\"https://de.linkedin.com/in/sebastian-boldt-9b465261\",\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\",\"https://soundcloud.com/sebastian_boldt\"],\"app\":\"steemit/0.1\",\"format\":\"html\",\"image\":[\"https://cdn-images-1.medium.com/max/4000/1*i3SuhBo3VEC8G79ee1CQ5w.jpeg\"]}"
    }
  ]
}
2017/11/10 17:59:54
parent author
parent permlinkprogramming
authorsebastianboldt
permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
titleLearn & Master ⚔️ the Basics of RxSwift in 10 Minutes
body<html> <p>Every programmer should have heard of <em>Rx</em>. Whether it happened at the last developer conference or while reading a fresh blog article like this one 😎. It is almost impossible not to have heard of it, but what exactly is Reactive Programming? Let’s take a look on the Internet:</p> <blockquote><em>In computing, </em><em><strong>reactive programming</strong></em><em> is a programming paradigm oriented around data flows and the propagation of change. This means that it should be possible to express static or dynamic data flows with ease in the programming languages used, and that the underlying execution model will automatically propagate changes through the data flow. — Wikipedia</em></blockquote> <p>I am honest, after reading this paragraph, most people will have no idea what reactive programming actually is, so do I. This is the reason why I will try to create a simple, easy to understand Introduction for this modern approach to software development using the Swift Version of Rx: <strong>RxSwift</strong>. &nbsp;</p> <h2><strong>1. Observable Sequences 🎞</strong></h2> <p>The first thing you need to understand is that everything in <em><strong>RxSwift</strong></em> <em><strong>is an</strong></em> <em><strong>observable sequence</strong></em> <em><strong>or something that operates on or subscribes to events emitted by an</strong></em> <em><strong>observable sequence.</strong></em> <em><strong>Arrays,</strong></em> <em><strong>Strings or Dictionaries</strong></em> <em><strong>will be converted to</strong></em> <em><strong>observable sequences</strong></em> <em><strong>in</strong></em> <em><strong>RxSwift. You can create an</strong></em> <em><strong>observable sequence</strong></em> <em><strong>of any Object that conforms to the</strong></em> <a href="https://developer.apple.com/reference/swift/sequence"><em><strong>Sequence</strong></em> <em><strong>Protocol</strong></em></a> <strong>from the Swift Standard Library.</strong> <strong>Let’s create some observable sequences:</strong></p> <pre><code>let helloSequence = Observable.just("Hello Rx")<br> let fibonacciSequence = Observable.from([0,1,1,2,3,5,8])<br> let dictSequence = Observable.from([1:"Hello",2:"World"])</code></pre> <p><strong>You subscribe to observable sequences by calling</strong> <em>subscribe(on:(Event)-&gt; ())</em><em><strong>. The passed block will receive all events emitted by that sequence.</strong></em></p> <pre><code>let helloSequence = Observable.of("Hello Rx")<br> let subscription = helloSequence.subscribe { event in<br> &nbsp;print(event)<br> }<br> <strong>OUTPUT: <br> next("Hello Rx") <br> completed</strong></code></pre> <p><em><strong>Observable sequences can emit</strong></em> <em><strong>zero</strong></em> <em><strong>or more events</strong></em> <em><strong>over their lifetimes. In</strong></em> <em><strong>RxSwift</strong></em> <em><strong>an</strong></em> <em><strong>Event</strong></em> <em><strong>is just an</strong></em> <em><strong>Enumeration Type</strong></em> <em><strong>with 3 possible states:</strong></em>&nbsp;</p> <ul> <li><em><strong>.next(value: T) — </strong></em>When a value or collection of values is added to an observable sequence it will send the next event to its subscribers as seen above. The associated value will contain the actual value from the sequence.</li> <li><em><strong>.error(error: Error) — </strong></em>If an Error is encountered, a sequence will emit an error event. This will also terminate the sequence.</li> <li><em><strong>.completed</strong></em> <em><strong>—</strong></em> If a sequence ends normally it sends a completed event to its subscribers</li> </ul> <pre><code>let helloSequence = Observable.from(["H","e","l","l","o"])<br> let subscription = helloSequence.subscribe { event in<br> &nbsp;switch event {&nbsp;&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;case .next(let value):<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(value)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .error(let error):<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(error)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .completed:<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("completed")<br> &nbsp;}<br> }<br> <em><strong><br> OUTPUT:<br> H e l l o <br> completed</strong></em></code></pre> <p>If you want to cancel a subscription you can do that by calling dispose on it. You can also add the subscription to a Disposebagwhich will cancel the subscription for you automatically on deinit of the DisposeBag Instance. Another thing you can do is to subscribe just to a specific Event. For Example, if just want to receive the error events emitted by a sequence, you can use: subscribe(onError:(Error-&gt;())). This Code snippet will aggregate all the things you learned by now:</p> <pre><code>// Creating a DisposeBag so subscribtion will be cancelled correctly<br> let bag = DisposeBag()<br> <br> // Creating an Observable Sequence that emits a String value<br> let observable = Observable.just("Hello Rx!")<br> <br> // Creating a subscription just for next events<br> let subscription = observable.subscribe (onNext:{ <br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> // Adding the Subscription to a Dispose Bag<br> subscription.addDisposableTo(bag)</code></pre> <h2>Subjects 📫</h2> <p>A Subject is a special form of an Observable Sequence, you can subscribe and dynamically add elements to it. There are currently 4 different kinds of Subjects in RxSwift &nbsp;</p> <ul> <li><strong>PublishSubject</strong>: If you subscribe to it you will get all the events that will happen after you subscribed.</li> <li><strong>BehaviourSubject</strong>: A behavior subject will give any subscriber the most recent element and everything that is emitted by that sequence after the subscription happened.</li> <li><strong>ReplaySubject</strong>: If you want to replay more than the most recent element to new subscribers on the initial subscription you need to use a ReplaySubject. With a ReplaySubject, you can define how many recent items you want to emit to new subscribers.</li> <li><strong>Variable</strong>: A Variable is just a BehaviourSubject wrapper that feels more natural to a none reactive programmers. It can be used like a normal Variable.</li> </ul> <p>I’ll just show you how the PublishSubject works in this Article. If you want to know more about the other subject types, you need to take a look at the accompanying material on <a href="https://github.com/SebastianBoldt/Learn-and-Master-RxSwift">GitHub</a>. They basically differ only in the number of past events emitted and received by their subscribers on initial subscription.</p> <blockquote><em><strong>Publish: 0</strong></em> <em><strong>Behaviour &amp; Variable: 1</strong></em> <em><strong>Replay: N</strong></em></blockquote> <p>Let’s take a look at the PublishSubject. The first thing we need to do is to create an actual PublishSubject instance. This is super easy, we can use the default initializer for that.</p> <pre><code>let bag = DisposeBag()<br> var publishSubject = PublishSubject()</code></pre> <p>You can add new Values to that sequence by using the onNext() function. onCompleted() will complete the sequence and onError(error) will result in emitting an error event. Let’s add some values to our PublishSubject.</p> <pre><code>publishSubject.onNext("Hello")<br> publishSubject.onNext("World")</code></pre> <p>If you subscribe to that subject after adding “Hello” and “World” using onNext(), you won’t receive these two values through events. In contrast to a BehaviourSubject, that will receive “World”, which is the most recent event. Now let’s create a subscription and add some new values to the Subject. We also create a second subscription and add even more values to it. Please read the comments to understand what actually is going on.</p> <pre><code>let subscription1 = publishSubject.subscribe(onNext:{<br> &nbsp;print($0)<br> }).addDisposableTo(bag)<em><strong><br> <br> </strong></em>// Subscription1 receives these 2 events, Subscription2 won't<br> <br> publishSubject.onNext("Hello")<br> publishSubject.onNext("Again")<br> <br> <br> // Sub2 will not get "Hello" and "Again" because it susbcribed later<br> let subscription2 = publishSubject.subscribe(onNext:{<br> &nbsp;print(#line,$0)<br> })<br> <br> publishSubject.onNext("Both Subscriptions receive this message")</code></pre> <p>Congratulations 🎉. If you kept up reading to this point you should know the basics of RxSwift. There is a lot more to learn, but everything around Rx is based on these simple principles. You can take a short break now and play around with these concepts to fully understand them. If you are ready let us continue because there is a lot more interesting stuff to uncover.</p> <h2>Marble Diagrams 🙌🏼</h2> <p>If you work with RxSwift or Rx in general, you should get to know Marble Diagrams. A Marble Diagram visualizes the transformation of an observable sequence. It consists of the input stream on top, the output stream at the bottom and the actual transformation function in the middle. For Instance, let’s take look at an operation that delays your emitted events from an observable sequence by 150 milliseconds. Please ignore the scheduler parameter because I will introduce it later in the article: &nbsp;Easy to understand, right? There are great open source projects for both iOS and Android which allows you to interactively play around with these diagrams on your mobile devices. Play around with them and I promise you that you will learn a lot about Rx in a short amount of time. &nbsp;Web-App: <a href="http://rxmarbles.com/">http://rxmarbles.com</a> &nbsp;iOS-App: <a href="https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8">https://itunes.apple.com/com/app/rxmarbles/id1087272442</a> &nbsp;Android: <a href="https://goo.gl/b5YD8Kcontent_copy">https://goo.gl/b5YD8K</a></p> <h2>Transformations ⚙️</h2> <p>Sometimes you want to transform, combine or filter the elements emitted by an observable sequence before the subscriber receives them. I will introduce you to the basic transformation operators, tell you something about Filters and possibilities to combine sequences. At last I will show you how to perform transformations, combinations etc. on different threads. Let’s get started.</p> <h3>4.1 Map</h3> <p>To transform Elements emitted from an observable Sequence, before they reach their subscribers, you use the <strong>map</strong> <strong>operator. Imagine a transformation that multiplies each value of a sequence with 10 before emitting.</strong>&nbsp;</p> <pre><code>Observable.of(1,2,3,4).map { value in <br> &nbsp;return value * 10<br> }.subscribe(onNext:{<br> &nbsp;print($0)<br> })<br> <strong>OUTPUT: 10 20 30 40</strong></code></pre> <h3><em><strong>4.2 FlatMap</strong></em></h3> <p>Imagine an Observable Sequence that consists of objects that are themselves Observables and you want to create a new Sequence from those. This is where FlatMap comes into play. FlatMap merges the emission of these resulting Observables and emitting these merged results as its own sequence. &nbsp;</p> <pre><code>let sequence1 &nbsp;= Observable.of(1,2)<br> let sequence2 &nbsp;= Observable.of(1,2)<br> <br> let sequenceOfSequences = Observable.of(sequence1,sequence2)<br> sequenceOfSequences.flatMap{ return $0 }.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <strong>OUTPUT: 1 2 1 2**</strong></code></pre> <h3>4.3 Scan</h3> <p>Scan starts with an initial seed value and is used to aggregate values just like reduce in Swift. &nbsp;</p> <pre><code>Observable.of(1,2,3,4,5).scan(0) { seed, value in<br> &nbsp;&nbsp;&nbsp;return seed + value<br> }.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> OUTPUT: 1 3 6 10 15</code></pre> <h3>4.4 Buffer</h3> <p>The Buffer operator transforms an Observable that emits items into an Observable that emits buffered collections of those items. &nbsp;</p> <pre><code>SequenceThatEmitsWithDifferentIntervals<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.buffer(timeSpan: 150, count: 3, scheduler:s)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> <br> <strong>OUTPUT: [1] [2,3] [4] [5,6] [7] []</strong></code></pre> <h2>5.Filter 🚬</h2> <p>If you only want to react on next events based on certain criteria you should use a filter operator.</p> <h3>5.1 Filter</h3> <p>The Basic filter Operation works similar to the swift equivalent. You just define a condition that needs to be passed and if the condition is fulfilled a .next event will be emitted to its subscribers. &nbsp;</p> <pre><code>Observable.of(2,30,22,5,60,1).filter{$0 &gt; 10}.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print($0)<br> })<br> <strong>OUTPUT: 30 22 60</strong></code></pre> <h3>5.2 DistinctUntilChanged</h3> <p>If you just want to emit next Events if the value changed from previous ones you need to use distinctUntilChanged. &nbsp;</p> <pre><code>Observable.of(1,2,2,1,3).distinctUntilChanged().subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <strong>OUTPUT: 1 2 1 3</strong></code></pre> <p>Other filter operators you should try: &nbsp;</p> <ul> <li>Debounce</li> <li>TakeDuration</li> <li>Skip</li> </ul> <h2>Combine 💑</h2> <p>Combining sequences is a common Task. RxSwift provides a lot of operators for you. Here are 3 of them:</p> <h3>6.1 StartWith</h3> <p>If you want an Observable to emit a specific sequence of items before it begins emitting the items normally expected from it, use the startWith operator. &nbsp;</p> <pre><code>Observable.of(2,3).startWith(1).subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <strong>OUTPUT: 1 2 3</strong></code></pre> <h3>6.2 Merge</h3> <p>You can combine the output of multiple Observables so that they act like a single Observable, by using the Merge operator. &nbsp;</p> <pre><code>let publish1 = PublishSubject()<br> let publish2 = PublishSubject()<em><strong><br> <br> </strong></em>Observable.of(publish1,publish2).merge().subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> publish1.onNext(20)<br> publish1.onNext(40)<br> publish1.onNext(60)<br> publish2.onNext(1)<br> publish1.onNext(80)<br> publish2.onNext(2)<br> publish1.onNext(100)<br> <strong>OUTPUT: 20 40 60 1 80 2 100</strong></code></pre> <h3>6.3 Zip</h3> <p>You use the Zip method if you want to merge items emitted by different observable sequences to one observable sequence. Zip will operate in strict sequence, so the first two elements emitted by Zip will be the first element of the first sequence and the first element of the second sequence combined. Keep also in Mind that Zip will only emit as many items as the number of items emitted of the source Observables that emits the fewest items. &nbsp;</p> <pre><code>let a = Observable.of(1,2,3,4,5)<br> let b = Observable.of("a","b","c","d")<br> <br> Observable.zip(a,b){ return ($0,$1) }.subscribe {<br> &nbsp;&nbsp;&nbsp;print($0)<br> }<br> <strong>OUTPUT: (1, "a")(2, "b") (3, "c") (4, "d")</strong></code></pre> <p>Other combination filters you should try:</p> <ul> <li>Concat</li> <li>CombineLatest</li> <li>SwitchLatests</li> </ul> <h2>Side Effects 👉</h2> <p>If you want to register callbacks that will be executed when certain events take place on an Observable Sequence you need to use the doOn Operator. It will not modify the emitted elements but rather just pass them through. You can use …</p> <ul> <li>do(onNext:) - if you want to do something just if a next event happened</li> <li>do(onError:) - if errors will be emitted and</li> <li>do(onCompleted:) - if the sequence finished successfully.</li> </ul> <pre><code>Observable.of(1,2,3,4,5).do(onNext: {<br> &nbsp;&nbsp;&nbsp;$0 * 10 *// This has no effect on the actual subscription<br> *}).subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })</code></pre> <h2>8.Schedulers ⏰</h2> <p><a href="https://goo.gl/b5YD8Kcontent_copy">Operators will work on the same thread as where the subscription is created. In RxSwift you use schedulers to force operators do their work on a specific queue. You can also force that the subscription should happen on a specifc Queue. You use subscribeOnand observeOn for those tasks. If you are familiar with the concept of operation-queues or dispatch-queues this should be nothing special for you. A scheduler can be serial or concurrent similar to GCD or OperationQueue. There are 5 Types of Schedulers in RxSwift:</a>&nbsp;</p> <ul> <li><strong>MainScheduler</strong> — “Abstracts work that needs to be performed on MainThread. In case schedule methods are called from the main thread, it will perform the action immediately without scheduling.This scheduler is usually used to perform UI work.”</li> <li><strong>CurrentThreadScheduler</strong> — “Schedules units of work on the current thread. This is the default scheduler for operators that generate elements.”</li> <li><strong>SerialDispatchQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific dispatchqueuet. It will make sure that even if a concurrent dispatch queue is passed, it's transformed into a serial one.Serial schedulers enable certain optimizations for observeOn.The main scheduler is an instance of SerialDispatchQueueScheduler"</li> <li><strong>ConcurrentDispatchQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific dispatchqueuet. You can also pass a serial dispatch queue, it shouldn't cause any problems. This scheduler is suitable when some work needs to be performed in the background.”</li> <li><strong>OperationQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific NSOperationQueue. This scheduler is suitable for cases when there is some bigger chunk of work that needs to be performed in the background and you want to fine tune concurrent processing using maxConcurrentOperationCount.”</li> </ul> <p>Here is a code snippet that shows you how to observe something concurrently on a background queue und subscribe on the main-queue.</p> <pre><code>let publish1 = PublishSubject()<br> let publish2 = PublishSubject()<br> <br> let concurrentScheduler = ConcurrentDispatchQueueScheduler(qos: .background)<br> Observable.of(publish1,publish2)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.observeOn(concurrentScheduler)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.merge()<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribeOn(MainScheduler())<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> publish1.onNext(20)<br> publish1.onNext(40)<br> <strong>OUTPUT: 20 40&nbsp;</strong></code></pre> <h2>It’s a wrap 🎁</h2> <p>Congratulation, you learned the basics of RxSwift. Happy Coding 🎉 Learn &amp; Master RxCocoa will be coming soon … Feel free to add me on <a href="https://github.com/SebastianBoldt">github</a>, <a href="https://twitter.com/sebastianboldt">twitter</a>, <a href="https://de.linkedin.com/in/sebastian-boldt-9b465261">linkedin</a> or <a href="https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p">xing</a> if you have any questions. If you like electronic music you can also listen to my Tracks on <a href="https://soundcloud.com/sebastian_boldt">SoundCloud</a> ;) <a href="https://github.com/SebastianBoldt">SebastianBoldt (Sebastian Boldt) · GitHub SebastianBoldt has 14 repositories available. Follow their code on GitHub.github.com</a> &nbsp;SOURCES:</p> <ul> <li><a href="https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md">https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md</a></li> <li><a href="http://reactivex.io/documentation/operators.html">http://reactivex.io/documentation/operators.html</a></li> <li><a href="http://rxmarbles.com/">http://rxmarbles.com</a></li> </ul> </html>
json metadata{"tags":["programming","rxswift","ios","swift"],"links":["https://developer.apple.com/reference/swift/sequence","https://github.com/SebastianBoldt/Learn-and-Master-RxSwift","http://rxmarbles.com/","https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8","https://goo.gl/b5YD8Kcontent_copy","https://github.com/SebastianBoldt","https://twitter.com/sebastianboldt","https://de.linkedin.com/in/sebastian-boldt-9b465261","https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p","https://soundcloud.com/sebastian_boldt","https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md","http://reactivex.io/documentation/operators.html"],"app":"steemit/0.1","format":"html"}
Transaction InfoBlock #17106145/Trx e37498c15e220537cce29d96a5a04b16edc2a52a
View Raw JSON Data
{
  "trx_id": "e37498c15e220537cce29d96a5a04b16edc2a52a",
  "block": 17106145,
  "trx_in_block": 9,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T17:59:54",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "programming",
      "author": "sebastianboldt",
      "permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "title": "Learn & Master ⚔️ the Basics of RxSwift in 10 Minutes",
      "body": "<html>\n<p>Every programmer should have heard of <em>Rx</em>. Whether it happened at the last developer conference or while reading a fresh blog article like this one 😎. It is almost impossible not to have heard of it, but what exactly is Reactive Programming? Let’s take a look on the Internet:</p>\n<blockquote><em>In computing, </em><em><strong>reactive programming</strong></em><em> is a programming paradigm oriented around data flows and the propagation of change. This means that it should be possible to express static or dynamic data flows with ease in the programming languages used, and that the underlying execution model will automatically propagate changes through the data flow. — Wikipedia</em></blockquote>\n<p>I am honest, after reading this paragraph, most people will have no idea what reactive programming actually is, so do I. This is the reason why I will try to create a simple, easy to understand Introduction for this modern approach to software development using the Swift Version of Rx: <strong>RxSwift</strong>. &nbsp;</p>\n<h2><strong>1. Observable Sequences 🎞</strong></h2>\n<p>The first thing you need to understand is that everything in <em><strong>RxSwift</strong></em> <em><strong>is an</strong></em> <em><strong>observable sequence</strong></em> <em><strong>or something that operates on or subscribes to events emitted by an</strong></em> <em><strong>observable sequence.</strong></em> <em><strong>Arrays,</strong></em> <em><strong>Strings or Dictionaries</strong></em> <em><strong>will be converted to</strong></em> <em><strong>observable sequences</strong></em> <em><strong>in</strong></em> <em><strong>RxSwift. You can create an</strong></em> <em><strong>observable sequence</strong></em> <em><strong>of any Object that conforms to the</strong></em> <a href=\"https://developer.apple.com/reference/swift/sequence\"><em><strong>Sequence</strong></em> <em><strong>Protocol</strong></em></a> <strong>from the Swift Standard Library.</strong> <strong>Let’s create some observable sequences:</strong></p>\n<pre><code>let helloSequence = Observable.just(\"Hello Rx\")<br>\nlet fibonacciSequence = Observable.from([0,1,1,2,3,5,8])<br>\nlet dictSequence = Observable.from([1:\"Hello\",2:\"World\"])</code></pre>\n<p><strong>You subscribe to observable sequences by calling</strong> <em>subscribe(on:(Event)-&gt; ())</em><em><strong>. The passed block will receive all events emitted by that sequence.</strong></em></p>\n<pre><code>let helloSequence = Observable.of(\"Hello Rx\")<br>\nlet subscription = helloSequence.subscribe { event in<br>\n &nbsp;print(event)<br>\n}<br>\n<strong>OUTPUT: <br>\nnext(\"Hello Rx\") <br>\ncompleted</strong></code></pre>\n<p><em><strong>Observable sequences can emit</strong></em> <em><strong>zero</strong></em> <em><strong>or more events</strong></em> <em><strong>over their lifetimes. In</strong></em> <em><strong>RxSwift</strong></em> <em><strong>an</strong></em> <em><strong>Event</strong></em> <em><strong>is just an</strong></em> <em><strong>Enumeration Type</strong></em> <em><strong>with 3 possible states:</strong></em>&nbsp;</p>\n<ul>\n  <li><em><strong>.next(value: T) — </strong></em>When a value or collection of values is added to an observable sequence it will send the next event to its subscribers as seen above. The associated value will contain the actual value from the sequence.</li>\n  <li><em><strong>.error(error: Error) — </strong></em>If an Error is encountered, a sequence will emit an error event. This will also terminate the sequence.</li>\n  <li><em><strong>.completed</strong></em> <em><strong>—</strong></em> If a sequence ends normally it sends a completed event to its subscribers</li>\n</ul>\n<pre><code>let helloSequence = Observable.from([\"H\",\"e\",\"l\",\"l\",\"o\"])<br>\nlet subscription = helloSequence.subscribe { event in<br>\n &nbsp;switch event {&nbsp;&nbsp;<br>\n &nbsp;&nbsp;&nbsp;&nbsp;case .next(let value):<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(value)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .error(let error):<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(error)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .completed:<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"completed\")<br>\n &nbsp;}<br>\n}<br>\n<em><strong><br>\nOUTPUT:<br>\nH e l l o <br>\ncompleted</strong></em></code></pre>\n<p>If you want to cancel a subscription you can do that by calling dispose on it. You can also add the subscription to a Disposebagwhich will cancel the subscription for you automatically on deinit of the DisposeBag Instance. Another thing you can do is to subscribe just to a specific Event. For Example, if just want to receive the error events emitted by a sequence, you can use: subscribe(onError:(Error-&gt;())). This Code snippet will aggregate all the things you learned by now:</p>\n<pre><code>// Creating a DisposeBag so subscribtion will be cancelled correctly<br>\nlet bag = DisposeBag()<br>\n<br>\n// Creating an Observable Sequence that emits a String value<br>\nlet observable = Observable.just(\"Hello Rx!\")<br>\n<br>\n// Creating a subscription just for next events<br>\nlet subscription = observable.subscribe (onNext:{ <br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\n// Adding the Subscription to a Dispose Bag<br>\nsubscription.addDisposableTo(bag)</code></pre>\n<h2>Subjects 📫</h2>\n<p>A Subject is a special form of an Observable Sequence, you can subscribe and dynamically add elements to it. There are currently 4 different kinds of Subjects in RxSwift &nbsp;</p>\n<ul>\n  <li><strong>PublishSubject</strong>: If you subscribe to it you will get all the events that will happen after you subscribed.</li>\n  <li><strong>BehaviourSubject</strong>: A behavior subject will give any subscriber the most recent element and everything that is emitted by that sequence after the subscription happened.</li>\n  <li><strong>ReplaySubject</strong>: If you want to replay more than the most recent element to new subscribers on the initial subscription you need to use a ReplaySubject. With a ReplaySubject, you can define how many recent items you want to emit to new subscribers.</li>\n  <li><strong>Variable</strong>: A Variable is just a BehaviourSubject wrapper that feels more natural to a none reactive programmers. It can be used like a normal Variable.</li>\n</ul>\n<p>I’ll just show you how the PublishSubject works in this Article. If you want to know more about the other subject types, you need to take a look at the accompanying material on <a href=\"https://github.com/SebastianBoldt/Learn-and-Master-RxSwift\">GitHub</a>. They basically differ only in the number of past events emitted and received by their subscribers on initial subscription.</p>\n<blockquote><em><strong>Publish: 0</strong></em> <em><strong>Behaviour &amp; Variable: 1</strong></em> <em><strong>Replay: N</strong></em></blockquote>\n<p>Let’s take a look at the PublishSubject. The first thing we need to do is to create an actual PublishSubject instance. This is super easy, we can use the default initializer for that.</p>\n<pre><code>let bag = DisposeBag()<br>\nvar publishSubject = PublishSubject()</code></pre>\n<p>You can add new Values to that sequence by using the onNext() function. onCompleted() will complete the sequence and onError(error) will result in emitting an error event. Let’s add some values to our PublishSubject.</p>\n<pre><code>publishSubject.onNext(\"Hello\")<br>\npublishSubject.onNext(\"World\")</code></pre>\n<p>If you subscribe to that subject after adding “Hello” and “World” using onNext(), you won’t receive these two values through events. In contrast to a BehaviourSubject, that will receive “World”, which is the most recent event. Now let’s create a subscription and add some new values to the Subject. We also create a second subscription and add even more values to it. Please read the comments to understand what actually is going on.</p>\n<pre><code>let subscription1 = publishSubject.subscribe(onNext:{<br>\n &nbsp;print($0)<br>\n}).addDisposableTo(bag)<em><strong><br>\n<br>\n</strong></em>// Subscription1 receives these 2 events, Subscription2 won't<br>\n<br>\npublishSubject.onNext(\"Hello\")<br>\npublishSubject.onNext(\"Again\")<br>\n<br>\n<br>\n// Sub2 will not get \"Hello\" and \"Again\" because it susbcribed later<br>\nlet subscription2 = publishSubject.subscribe(onNext:{<br>\n &nbsp;print(#line,$0)<br>\n})<br>\n<br>\npublishSubject.onNext(\"Both Subscriptions receive this message\")</code></pre>\n<p>Congratulations 🎉. If you kept up reading to this point you should know the basics of RxSwift. There is a lot more to learn, but everything around Rx is based on these simple principles. You can take a short break now and play around with these concepts to fully understand them. If you are ready let us continue because there is a lot more interesting stuff to uncover.</p>\n<h2>Marble Diagrams 🙌🏼</h2>\n<p>If you work with RxSwift or Rx in general, you should get to know Marble Diagrams. A Marble Diagram visualizes the transformation of an observable sequence. It consists of the input stream on top, the output stream at the bottom and the actual transformation function in the middle. For Instance, let’s take look at an operation that delays your emitted events from an observable sequence by 150 milliseconds. Please ignore the scheduler parameter because I will introduce it later in the article: &nbsp;Easy to understand, right? There are great open source projects for both iOS and Android which allows you to interactively play around with these diagrams on your mobile devices. Play around with them and I promise you that you will learn a lot about Rx in a short amount of time. &nbsp;Web-App: <a href=\"http://rxmarbles.com/\">http://rxmarbles.com</a> &nbsp;iOS-App: <a href=\"https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8\">https://itunes.apple.com/com/app/rxmarbles/id1087272442</a> &nbsp;Android: <a href=\"https://goo.gl/b5YD8Kcontent_copy\">https://goo.gl/b5YD8K</a></p>\n<h2>Transformations ⚙️</h2>\n<p>Sometimes you want to transform, combine or filter the elements emitted by an observable sequence before the subscriber receives them. I will introduce you to the basic transformation operators, tell you something about Filters and possibilities to combine sequences. At last I will show you how to perform transformations, combinations etc. on different threads. Let’s get started.</p>\n<h3>4.1 Map</h3>\n<p>To transform Elements emitted from an observable Sequence, before they reach their subscribers, you use the <strong>map</strong> <strong>operator. Imagine a transformation that multiplies each value of a sequence with 10 before emitting.</strong>&nbsp;</p>\n<pre><code>Observable.of(1,2,3,4).map { value in <br>\n &nbsp;return value * 10<br>\n}.subscribe(onNext:{<br>\n &nbsp;print($0)<br>\n})<br>\n<strong>OUTPUT: 10 20 30 40</strong></code></pre>\n<h3><em><strong>4.2 FlatMap</strong></em></h3>\n<p>Imagine an Observable Sequence that consists of objects that are themselves Observables and you want to create a new Sequence from those. This is where FlatMap comes into play. FlatMap merges the emission of these resulting Observables and emitting these merged results as its own sequence. &nbsp;</p>\n<pre><code>let sequence1 &nbsp;= Observable.of(1,2)<br>\nlet sequence2 &nbsp;= Observable.of(1,2)<br>\n<br>\nlet sequenceOfSequences = Observable.of(sequence1,sequence2)<br>\nsequenceOfSequences.flatMap{ return $0 }.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<strong>OUTPUT: 1 2 1 2**</strong></code></pre>\n<h3>4.3 Scan</h3>\n<p>Scan starts with an initial seed value and is used to aggregate values just like reduce in Swift. &nbsp;</p>\n<pre><code>Observable.of(1,2,3,4,5).scan(0) { seed, value in<br>\n &nbsp;&nbsp;&nbsp;return seed + value<br>\n}.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\nOUTPUT: 1 3 6 10 15</code></pre>\n<h3>4.4 Buffer</h3>\n<p>The Buffer operator transforms an Observable that emits items into an Observable that emits buffered collections of those items. &nbsp;</p>\n<pre><code>SequenceThatEmitsWithDifferentIntervals<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.buffer(timeSpan: 150, count: 3, scheduler:s)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\n<br>\n<strong>OUTPUT: [1] [2,3] [4] [5,6] [7] []</strong></code></pre>\n<h2>5.Filter 🚬</h2>\n<p>If you only want to react on next events based on certain criteria you should use a filter operator.</p>\n<h3>5.1 Filter</h3>\n<p>The Basic filter Operation works similar to the swift equivalent. You just define a condition that needs to be passed and if the condition is fulfilled a .next event will be emitted to its subscribers. &nbsp;</p>\n<pre><code>Observable.of(2,30,22,5,60,1).filter{$0 &gt; 10}.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<strong>OUTPUT: 30 22 60</strong></code></pre>\n<h3>5.2 DistinctUntilChanged</h3>\n<p>If you just want to emit next Events if the value changed from previous ones you need to use distinctUntilChanged. &nbsp;</p>\n<pre><code>Observable.of(1,2,2,1,3).distinctUntilChanged().subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<strong>OUTPUT: 1 2 1 3</strong></code></pre>\n<p>Other filter operators you should try: &nbsp;</p>\n<ul>\n  <li>Debounce</li>\n  <li>TakeDuration</li>\n  <li>Skip</li>\n</ul>\n<h2>Combine 💑</h2>\n<p>Combining sequences is a common Task. RxSwift provides a lot of operators for you. Here are 3 of them:</p>\n<h3>6.1 StartWith</h3>\n<p>If you want an Observable to emit a specific sequence of items before it begins emitting the items normally expected from it, use the startWith operator. &nbsp;</p>\n<pre><code>Observable.of(2,3).startWith(1).subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<strong>OUTPUT: 1 2 3</strong></code></pre>\n<h3>6.2 Merge</h3>\n<p>You can combine the output of multiple Observables so that they act like a single Observable, by using the Merge operator. &nbsp;</p>\n<pre><code>let publish1 = PublishSubject()<br>\nlet publish2 = PublishSubject()<em><strong><br>\n<br>\n</strong></em>Observable.of(publish1,publish2).merge().subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\npublish1.onNext(20)<br>\npublish1.onNext(40)<br>\npublish1.onNext(60)<br>\npublish2.onNext(1)<br>\npublish1.onNext(80)<br>\npublish2.onNext(2)<br>\npublish1.onNext(100)<br>\n<strong>OUTPUT: 20 40 60 1 80 2 100</strong></code></pre>\n<h3>6.3 Zip</h3>\n<p>You use the Zip method if you want to merge items emitted by different observable sequences to one observable sequence. Zip will operate in strict sequence, so the first two elements emitted by Zip will be the first element of the first sequence and the first element of the second sequence combined. Keep also in Mind that Zip will only emit as many items as the number of items emitted of the source Observables that emits the fewest items. &nbsp;</p>\n<pre><code>let a = Observable.of(1,2,3,4,5)<br>\nlet b = Observable.of(\"a\",\"b\",\"c\",\"d\")<br>\n<br>\nObservable.zip(a,b){ return ($0,$1) }.subscribe {<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n}<br>\n<strong>OUTPUT: (1, \"a\")(2, \"b\") (3, \"c\") (4, \"d\")</strong></code></pre>\n<p>Other combination filters you should try:</p>\n<ul>\n  <li>Concat</li>\n  <li>CombineLatest</li>\n  <li>SwitchLatests</li>\n</ul>\n<h2>Side Effects 👉</h2>\n<p>If you want to register callbacks that will be executed when certain events take place on an Observable Sequence you need to use the doOn Operator. It will not modify the emitted elements but rather just pass them through. You can use …</p>\n<ul>\n  <li>do(onNext:) - if you want to do something just if a next event happened</li>\n  <li>do(onError:) - if errors will be emitted and</li>\n  <li>do(onCompleted:) - if the sequence finished successfully.</li>\n</ul>\n<pre><code>Observable.of(1,2,3,4,5).do(onNext: {<br>\n &nbsp;&nbsp;&nbsp;$0 * 10 *// This has no effect on the actual subscription<br>\n*}).subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})</code></pre>\n<h2>8.Schedulers ⏰</h2>\n<p><a href=\"https://goo.gl/b5YD8Kcontent_copy\">Operators will work on the same thread as where the subscription is created. In RxSwift you use schedulers to force operators do their work on a specific queue. You can also force that the subscription should happen on a specifc Queue. You use subscribeOnand observeOn for those tasks. If you are familiar with the concept of operation-queues or dispatch-queues this should be nothing special for you. A scheduler can be serial or concurrent similar to GCD or OperationQueue. There are 5 Types of Schedulers in RxSwift:</a>&nbsp;</p>\n<ul>\n  <li><strong>MainScheduler</strong> — “Abstracts work that needs to be performed on MainThread. In case schedule methods are called from the main thread, it will perform the action immediately without scheduling.This scheduler is usually used to perform UI work.”</li>\n  <li><strong>CurrentThreadScheduler</strong> — “Schedules units of work on the current thread. This is the default scheduler for operators that generate elements.”</li>\n  <li><strong>SerialDispatchQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific dispatchqueuet. It will make sure that even if a concurrent dispatch queue is passed, it's transformed into a serial one.Serial schedulers enable certain optimizations for observeOn.The main scheduler is an instance of SerialDispatchQueueScheduler\"</li>\n  <li><strong>ConcurrentDispatchQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific dispatchqueuet. You can also pass a serial dispatch queue, it shouldn't cause any problems. This scheduler is suitable when some work needs to be performed in the background.”</li>\n  <li><strong>OperationQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific NSOperationQueue. This scheduler is suitable for cases when there is some bigger chunk of work that needs to be performed in the background and you want to fine tune concurrent processing using maxConcurrentOperationCount.”</li>\n</ul>\n<p>Here is a code snippet that shows you how to observe something concurrently on a background queue und subscribe on the main-queue.</p>\n<pre><code>let publish1 = PublishSubject()<br>\nlet publish2 = PublishSubject()<br>\n<br>\nlet concurrentScheduler = ConcurrentDispatchQueueScheduler(qos: .background)<br>\nObservable.of(publish1,publish2)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.observeOn(concurrentScheduler)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.merge()<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribeOn(MainScheduler())<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\npublish1.onNext(20)<br>\npublish1.onNext(40)<br>\n<strong>OUTPUT: 20 40&nbsp;</strong></code></pre>\n<h2>It’s a wrap 🎁</h2>\n<p>Congratulation, you learned the basics of RxSwift. Happy Coding 🎉 Learn &amp; Master RxCocoa will be coming soon … Feel free to add me on <a href=\"https://github.com/SebastianBoldt\">github</a>, <a href=\"https://twitter.com/sebastianboldt\">twitter</a>, <a href=\"https://de.linkedin.com/in/sebastian-boldt-9b465261\">linkedin</a> or <a href=\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\">xing</a> if you have any questions. If you like electronic music you can also listen to my Tracks on <a href=\"https://soundcloud.com/sebastian_boldt\">SoundCloud</a> ;) <a href=\"https://github.com/SebastianBoldt\">SebastianBoldt (Sebastian Boldt) · GitHub SebastianBoldt has 14 repositories available. Follow their code on GitHub.github.com</a> &nbsp;SOURCES:</p>\n<ul>\n  <li><a href=\"https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md\">https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md</a></li>\n  <li><a href=\"http://reactivex.io/documentation/operators.html\">http://reactivex.io/documentation/operators.html</a></li>\n  <li><a href=\"http://rxmarbles.com/\">http://rxmarbles.com</a></li>\n</ul>\n</html>",
      "json_metadata": "{\"tags\":[\"programming\",\"rxswift\",\"ios\",\"swift\"],\"links\":[\"https://developer.apple.com/reference/swift/sequence\",\"https://github.com/SebastianBoldt/Learn-and-Master-RxSwift\",\"http://rxmarbles.com/\",\"https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8\",\"https://goo.gl/b5YD8Kcontent_copy\",\"https://github.com/SebastianBoldt\",\"https://twitter.com/sebastianboldt\",\"https://de.linkedin.com/in/sebastian-boldt-9b465261\",\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\",\"https://soundcloud.com/sebastian_boldt\",\"https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md\",\"http://reactivex.io/documentation/operators.html\"],\"app\":\"steemit/0.1\",\"format\":\"html\"}"
    }
  ]
}
2017/11/10 17:59:09
parent author
parent permlinkprogramming
authorsebastianboldt
permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
titleLearn & Master ⚔️ the Basics of RxSwift in 10 Minutes
body<html> <p>Every programmer should have heard of <em>Rx</em>. Whether it happened at the last developer conference or while reading a fresh blog article like this one 😎. It is almost impossible not to have heard of it, but what exactly is Reactive Programming? Let’s take a look on the Internet:</p> <blockquote><em>In computing, </em><em><strong>reactive programming</strong></em><em> is a programming paradigm oriented around data flows and the propagation of change. This means that it should be possible to express static or dynamic data flows with ease in the programming languages used, and that the underlying execution model will automatically propagate changes through the data flow. — Wikipedia</em></blockquote> <p>I am honest, after reading this paragraph, most people will have no idea what reactive programming actually is, so do I. This is the reason why I will try to create a simple, easy to understand Introduction for this modern approach to software development using the Swift Version of Rx: <strong>RxSwift</strong>. &nbsp;</p> <h2><strong>1. Observable Sequences 🎞</strong></h2> <p>The first thing you need to understand is that everything in <em><strong>RxSwift</strong></em> <em><strong>is an</strong></em> <em><strong>observable sequence</strong></em> <em><strong>or something that operates on or subscribes to events emitted by an</strong></em> <em><strong>observable sequence.</strong></em> <em><strong>Arrays,</strong></em> <em><strong>Strings or Dictionaries</strong></em> <em><strong>will be converted to</strong></em> <em><strong>observable sequences</strong></em> <em><strong>in</strong></em> <em><strong>RxSwift. You can create an</strong></em> <em><strong>observable sequence</strong></em> <em><strong>of any Object that conforms to the</strong></em> <a href="https://developer.apple.com/reference/swift/sequence"><em><strong>Sequence</strong></em> <em><strong>Protocol</strong></em></a> <strong>from the Swift Standard Library.</strong> <strong>Let’s create some observable sequences:</strong></p> <pre><code>let helloSequence = Observable.just("Hello Rx")<br> let fibonacciSequence = Observable.from([0,1,1,2,3,5,8])<br> let dictSequence = Observable.from([1:"Hello",2:"World"])</code></pre> <p><strong>You subscribe to observable sequences by calling</strong> <em>subscribe(on:(Event)-&gt; ())</em><em><strong>. The passed block will receive all events emitted by that sequence.</strong></em></p> <pre><code>let helloSequence = Observable.of("Hello Rx")<br> let subscription = helloSequence.subscribe { event in<br> &nbsp;print(event)<br> }<br> <strong>OUTPUT: <br> next("Hello Rx") <br> completed</strong></code></pre> <p><em><strong>Observable sequences can emit</strong></em> <em><strong>zero</strong></em> <em><strong>or more events</strong></em> <em><strong>over their lifetimes. In</strong></em> <em><strong>RxSwift</strong></em> <em><strong>an</strong></em> <em><strong>Event</strong></em> <em><strong>is just an</strong></em> <em><strong>Enumeration Type</strong></em> <em><strong>with 3 possible states:</strong></em>&nbsp;</p> <ul> <li><em><strong>.next(value: T) — </strong></em>When a value or collection of values is added to an observable sequence it will send the next event to its subscribers as seen above. The associated value will contain the actual value from the sequence.</li> <li><em><strong>.error(error: Error) — </strong></em>If an Error is encountered, a sequence will emit an error event. This will also terminate the sequence.</li> <li><em><strong>.completed</strong></em> <em><strong>—</strong></em> If a sequence ends normally it sends a completed event to its subscribers</li> </ul> <pre><code>let helloSequence = Observable.from(["H","e","l","l","o"])<br> let subscription = helloSequence.subscribe { event in<br> &nbsp;switch event {&nbsp;&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;case .next(let value):<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(value)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .error(let error):<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(error)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .completed:<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("completed")<br> &nbsp;}<br> }<br> <em><strong><br> OUTPUT:<br> H e l l o <br> completed</strong></em></code></pre> <p>If you want to cancel a subscription you can do that by calling dispose on it. You can also add the subscription to a Disposebagwhich will cancel the subscription for you automatically on deinit of the DisposeBag Instance. Another thing you can do is to subscribe just to a specific Event. For Example, if just want to receive the error events emitted by a sequence, you can use: subscribe(onError:(Error-&gt;())). This Code snippet will aggregate all the things you learned by now:</p> <pre><code>// Creating a DisposeBag so subscribtion will be cancelled correctly<br> let bag = DisposeBag()<br> <br> // Creating an Observable Sequence that emits a String value<br> let observable = Observable.just("Hello Rx!")<br> <br> // Creating a subscription just for next events<br> let subscription = observable.subscribe (onNext:{ <br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> // Adding the Subscription to a Dispose Bag<br> subscription.addDisposableTo(bag)</code></pre> <h2>Subjects 📫</h2> <p>A Subject is a special form of an Observable Sequence, you can subscribe and dynamically add elements to it. There are currently 4 different kinds of Subjects in RxSwift &nbsp;</p> <ul> <li><strong>PublishSubject</strong>: If you subscribe to it you will get all the events that will happen after you subscribed.</li> <li><strong>BehaviourSubject</strong>: A behavior subject will give any subscriber the most recent element and everything that is emitted by that sequence after the subscription happened.</li> <li><strong>ReplaySubject</strong>: If you want to replay more than the most recent element to new subscribers on the initial subscription you need to use a ReplaySubject. With a ReplaySubject, you can define how many recent items you want to emit to new subscribers.</li> <li><strong>Variable</strong>: A Variable is just a BehaviourSubject wrapper that feels more natural to a none reactive programmers. It can be used like a normal Variable.</li> </ul> <p>I’ll just show you how the PublishSubject works in this Article. If you want to know more about the other subject types, you need to take a look at the accompanying material on <a href="https://github.com/SebastianBoldt/Learn-and-Master-RxSwift">GitHub</a>. They basically differ only in the number of past events emitted and received by their subscribers on initial subscription.</p> <blockquote><em><strong>Publish: 0</strong></em> <em><strong>Behaviour &amp; Variable: 1</strong></em> <em><strong>Replay: N</strong></em></blockquote> <p>Let’s take a look at the PublishSubject. The first thing we need to do is to create an actual PublishSubject instance. This is super easy, we can use the default initializer for that.</p> <pre><code>let bag = DisposeBag()<br> var publishSubject = PublishSubject()</code></pre> <p>You can add new Values to that sequence by using the onNext() function. onCompleted() will complete the sequence and onError(error) will result in emitting an error event. Let’s add some values to our PublishSubject.</p> <pre><code>publishSubject.onNext("Hello")<br> publishSubject.onNext("World")</code></pre> <p>If you subscribe to that subject after adding “Hello” and “World” using onNext(), you won’t receive these two values through events. In contrast to a BehaviourSubject, that will receive “World”, which is the most recent event. Now let’s create a subscription and add some new values to the Subject. We also create a second subscription and add even more values to it. Please read the comments to understand what actually is going on.</p> <pre><code>let subscription1 = publishSubject.subscribe(onNext:{<br> &nbsp;print($0)<br> }).addDisposableTo(bag)<em><strong><br> <br> </strong></em>// Subscription1 receives these 2 events, Subscription2 won't<br> <br> publishSubject.onNext("Hello")<br> publishSubject.onNext("Again")<br> <br> <br> // Sub2 will not get "Hello" and "Again" because it susbcribed later<br> let subscription2 = publishSubject.subscribe(onNext:{<br> &nbsp;print(#line,$0)<br> })<br> <br> publishSubject.onNext("Both Subscriptions receive this message")</code></pre> <p>Congratulations 🎉. If you kept up reading to this point you should know the basics of RxSwift. There is a lot more to learn, but everything around Rx is based on these simple principles. You can take a short break now and play around with these concepts to fully understand them. If you are ready let us continue because there is a lot more interesting stuff to uncover.</p> <h2>Marble Diagrams 🙌🏼</h2> <p>If you work with RxSwift or Rx in general, you should get to know Marble Diagrams. A Marble Diagram visualizes the transformation of an observable sequence. It consists of the input stream on top, the output stream at the bottom and the actual transformation function in the middle. For Instance, let’s take look at an operation that delays your emitted events from an observable sequence by 150 milliseconds. Please ignore the scheduler parameter because I will introduce it later in the article: &nbsp;Easy to understand, right? There are great open source projects for both iOS and Android which allows you to interactively play around with these diagrams on your mobile devices. Play around with them and I promise you that you will learn a lot about Rx in a short amount of time. &nbsp;Web-App: <a href="http://rxmarbles.com/">http://rxmarbles.com</a> &nbsp;iOS-App: <a href="https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8">https://itunes.apple.com/com/app/rxmarbles/id1087272442</a> &nbsp;Android: <a href="https://goo.gl/b5YD8Kcontent_copy">https://goo.gl/b5YD8K</a></p> <h2>Transformations ⚙️</h2> <p>Sometimes you want to transform, combine or filter the elements emitted by an observable sequence before the subscriber receives them. I will introduce you to the basic transformation operators, tell you something about Filters and possibilities to combine sequences. At last I will show you how to perform transformations, combinations etc. on different threads. Let’s get started.</p> <h3>4.1 Map</h3> <p>To transform Elements emitted from an observable Sequence, before they reach their subscribers, you use the <strong>map</strong> <strong>operator. Imagine a transformation that multiplies each value of a sequence with 10 before emitting.</strong>&nbsp;</p> <pre><code>Observable.of(1,2,3,4).map { value in <br> &nbsp;return value * 10<br> }.subscribe(onNext:{<br> &nbsp;print($0)<br> })<br> <strong>OUTPUT: 10 20 30 40</strong></code></pre> <h3><em><strong>4.2 FlatMap</strong></em></h3> <p>Imagine an Observable Sequence that consists of objects that are themselves Observables and you want to create a new Sequence from those. This is where FlatMap comes into play. FlatMap merges the emission of these resulting Observables and emitting these merged results as its own sequence. &nbsp;</p> <pre><code>let sequence1 &nbsp;= Observable.of(1,2)<br> let sequence2 &nbsp;= Observable.of(1,2)<br> <br> let sequenceOfSequences = Observable.of(sequence1,sequence2)<br> sequenceOfSequences.flatMap{ return $0 }.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <strong>OUTPUT: 1 2 1 2**</strong></code></pre> <h3>4.3 Scan</h3> <p>Scan starts with an initial seed value and is used to aggregate values just like reduce in Swift. &nbsp;</p> <pre><code>Observable.of(1,2,3,4,5).scan(0) { seed, value in<br> &nbsp;&nbsp;&nbsp;return seed + value<br> }.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> OUTPUT: 1 3 6 10 15</code></pre> <h3>4.4 Buffer</h3> <p>The Buffer operator transforms an Observable that emits items into an Observable that emits buffered collections of those items. &nbsp;</p> <pre><code>SequenceThatEmitsWithDifferentIntervals<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.buffer(timeSpan: 150, count: 3, scheduler:s)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> <br> <strong>OUTPUT: [1] [2,3] [4] [5,6] [7] []</strong></code></pre> <h2>5.Filter 🚬</h2> <p>If you only want to react on next events based on certain criteria you should use a filter operator.</p> <h3>5.1 Filter</h3> <p>The Basic filter Operation works similar to the swift equivalent. You just define a condition that needs to be passed and if the condition is fulfilled a .next event will be emitted to its subscribers. &nbsp;</p> <pre><code>Observable.of(2,30,22,5,60,1).filter{$0 &gt; 10}.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print($0)<br> })<br> <strong>OUTPUT: 30 22 60</strong></code></pre> <h3>5.2 DistinctUntilChanged</h3> <p>If you just want to emit next Events if the value changed from previous ones you need to use distinctUntilChanged. &nbsp;</p> <pre><code>Observable.of(1,2,2,1,3).distinctUntilChanged().subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <strong>OUTPUT: 1 2 1 3</strong></code></pre> <p>Other filter operators you should try: &nbsp;</p> <ul> <li>Debounce</li> <li>TakeDuration</li> <li>Skip</li> </ul> <h2>Combine 💑</h2> <p>Combining sequences is a common Task. RxSwift provides a lot of operators for you. Here are 3 of them:</p> <h3>6.1 StartWith</h3> <p>If you want an Observable to emit a specific sequence of items before it begins emitting the items normally expected from it, use the startWith operator. &nbsp;</p> <pre><code>Observable.of(2,3).startWith(1).subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <strong>OUTPUT: 1 2 3</strong></code></pre> <h3>6.2 Merge</h3> <p>You can combine the output of multiple Observables so that they act like a single Observable, by using the Merge operator. &nbsp;</p> <pre><code>let publish1 = PublishSubject()<br> let publish2 = PublishSubject()<em><strong><br> <br> </strong></em>Observable.of(publish1,publish2).merge().subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> publish1.onNext(20)<br> publish1.onNext(40)<br> publish1.onNext(60)<br> publish2.onNext(1)<br> publish1.onNext(80)<br> publish2.onNext(2)<br> publish1.onNext(100)<br> <strong>OUTPUT: 20 40 60 1 80 2 100</strong></code></pre> <h3>6.3 Zip</h3> <p>You use the Zip method if you want to merge items emitted by different observable sequences to one observable sequence. Zip will operate in strict sequence, so the first two elements emitted by Zip will be the first element of the first sequence and the first element of the second sequence combined. Keep also in Mind that Zip will only emit as many items as the number of items emitted of the source Observables that emits the fewest items. &nbsp;</p> <pre><code>let a = Observable.of(1,2,3,4,5)<br> let b = Observable.of("a","b","c","d")<br> <br> Observable.zip(a,b){ return ($0,$1) }.subscribe {<br> &nbsp;&nbsp;&nbsp;print($0)<br> }<br> <strong>OUTPUT: (1, "a")(2, "b") (3, "c") (4, "d")</strong></code></pre> <p>Other combination filters you should try:</p> <ul> <li>Concat</li> <li>CombineLatest</li> <li>SwitchLatests</li> </ul> <h2>Side Effects 👉</h2> <p>If you want to register callbacks that will be executed when certain events take place on an Observable Sequence you need to use the doOn Operator. It will not modify the emitted elements but rather just pass them through. You can use …</p> <ul> <li>do(onNext:) - if you want to do something just if a next event happened</li> <li>do(onError:) - if errors will be emitted and</li> <li>do(onCompleted:) - if the sequence finished successfully.</li> </ul> <pre><code>Observable.of(1,2,3,4,5).do(onNext: {<br> &nbsp;&nbsp;&nbsp;$0 * 10 *// This has no effect on the actual subscription<br> *}).subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })</code></pre> <h2>8.Schedulers ⏰</h2> <p><a href="https://goo.gl/b5YD8Kcontent_copy">Operators will work on the same thread as where the subscription is created. In RxSwift you use schedulers to force operators do their work on a specific queue. You can also force that the subscription should happen on a specifc Queue. You use subscribeOnand observeOn for those tasks. If you are familiar with the concept of operation-queues or dispatch-queues this should be nothing special for you. A scheduler can be serial or concurrent similar to GCD or OperationQueue. There are 5 Types of Schedulers in RxSwift:</a>&nbsp;</p> <ul> <li><strong>MainScheduler</strong> — “Abstracts work that needs to be performed on MainThread. In case schedule methods are called from the main thread, it will perform the action immediately without scheduling.This scheduler is usually used to perform UI work.”</li> <li><strong>CurrentThreadScheduler</strong> — “Schedules units of work on the current thread. This is the default scheduler for operators that generate elements.”</li> <li><strong>SerialDispatchQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific dispatchqueuet. It will make sure that even if a concurrent dispatch queue is passed, it's transformed into a serial one.Serial schedulers enable certain optimizations for observeOn.The main scheduler is an instance of SerialDispatchQueueScheduler"</li> <li><strong>ConcurrentDispatchQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific dispatchqueuet. You can also pass a serial dispatch queue, it shouldn't cause any problems. This scheduler is suitable when some work needs to be performed in the background.”</li> <li><strong>OperationQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific NSOperationQueue. This scheduler is suitable for cases when there is some bigger chunk of work that needs to be performed in the background and you want to fine tune concurrent processing using maxConcurrentOperationCount.”</li> </ul> <p>Here is a code snippet that shows you how to observe something concurrently on a background queue und subscribe on the main-queue.</p> <pre><code>let publish1 = PublishSubject()<br> let publish2 = PublishSubject()<br> <br> let concurrentScheduler = ConcurrentDispatchQueueScheduler(qos: .background)<br> Observable.of(publish1,publish2)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.observeOn(concurrentScheduler)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.merge()<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribeOn(MainScheduler())<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> publish1.onNext(20)<br> publish1.onNext(40)<br> <strong>OUTPUT: 20 40&nbsp;</strong></code></pre> <h2>It’s a wrap 🎁</h2> <p>Congratulation, you learned the basics of RxSwift. Happy Coding 🎉 Learn &amp; Master RxCocoa will be coming soon … Feel free to add me on <a href="https://github.com/SebastianBoldt">github</a>, <a href="https://twitter.com/sebastianboldt">twitter</a>, <a href="https://de.linkedin.com/in/sebastian-boldt-9b465261">linkedin</a> or <a href="https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p">xing</a> if you have any questions. If you like electronic music you can also listen to my Tracks on <a href="https://soundcloud.com/sebastian_boldt">SoundCloud</a> ;) <a href="https://github.com/SebastianBoldt">SebastianBoldt (Sebastian Boldt) · GitHub SebastianBoldt has 14 repositories available. Follow their code on GitHub.github.com</a> &nbsp;SOURCES:</p> <ul> <li><a href="https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md">https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md</a></li> <li><a href="http://reactivex.io/documentation/operators.html">http://reactivex.io/documentation/operators.html</a></li> <li><a href="http://rxmarbles.com/">http://rxmarbles.com</a></li> </ul> </html>
json metadata{"tags":["programming","rxswift","ios","swift"],"links":["https://developer.apple.com/reference/swift/sequence","https://github.com/SebastianBoldt/Learn-and-Master-RxSwift","http://rxmarbles.com/","https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8","https://goo.gl/b5YD8Kcontent_copy","https://github.com/SebastianBoldt","https://twitter.com/sebastianboldt","https://de.linkedin.com/in/sebastian-boldt-9b465261","https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p","https://soundcloud.com/sebastian_boldt","https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md","http://reactivex.io/documentation/operators.html"],"app":"steemit/0.1","format":"html"}
Transaction InfoBlock #17106130/Trx 788342e9f1ebc2890f39e6aced8d98a301557b97
View Raw JSON Data
{
  "trx_id": "788342e9f1ebc2890f39e6aced8d98a301557b97",
  "block": 17106130,
  "trx_in_block": 21,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T17:59:09",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "programming",
      "author": "sebastianboldt",
      "permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "title": "Learn & Master ⚔️ the Basics of RxSwift in 10 Minutes",
      "body": "<html>\n<p>Every programmer should have heard of <em>Rx</em>. Whether it happened at the last developer conference or while reading a fresh blog article like this one 😎. It is almost impossible not to have heard of it, but what exactly is Reactive Programming? Let’s take a look on the Internet:</p>\n<blockquote><em>In computing, </em><em><strong>reactive programming</strong></em><em> is a programming paradigm oriented around data flows and the propagation of change. This means that it should be possible to express static or dynamic data flows with ease in the programming languages used, and that the underlying execution model will automatically propagate changes through the data flow. — Wikipedia</em></blockquote>\n<p>I am honest, after reading this paragraph, most people will have no idea what reactive programming actually is, so do I. This is the reason why I will try to create a simple, easy to understand Introduction for this modern approach to software development using the Swift Version of Rx: <strong>RxSwift</strong>. &nbsp;</p>\n<h2><strong>1. Observable Sequences 🎞</strong></h2>\n<p>The first thing you need to understand is that everything in <em><strong>RxSwift</strong></em> <em><strong>is an</strong></em> <em><strong>observable sequence</strong></em> <em><strong>or something that operates on or subscribes to events emitted by an</strong></em> <em><strong>observable sequence.</strong></em> <em><strong>Arrays,</strong></em> <em><strong>Strings or Dictionaries</strong></em> <em><strong>will be converted to</strong></em> <em><strong>observable sequences</strong></em> <em><strong>in</strong></em> <em><strong>RxSwift. You can create an</strong></em> <em><strong>observable sequence</strong></em> <em><strong>of any Object that conforms to the</strong></em> <a href=\"https://developer.apple.com/reference/swift/sequence\"><em><strong>Sequence</strong></em> <em><strong>Protocol</strong></em></a> <strong>from the Swift Standard Library.</strong> <strong>Let’s create some observable sequences:</strong></p>\n<pre><code>let helloSequence = Observable.just(\"Hello Rx\")<br>\nlet fibonacciSequence = Observable.from([0,1,1,2,3,5,8])<br>\nlet dictSequence = Observable.from([1:\"Hello\",2:\"World\"])</code></pre>\n<p><strong>You subscribe to observable sequences by calling</strong> <em>subscribe(on:(Event)-&gt; ())</em><em><strong>. The passed block will receive all events emitted by that sequence.</strong></em></p>\n<pre><code>let helloSequence = Observable.of(\"Hello Rx\")<br>\nlet subscription = helloSequence.subscribe { event in<br>\n &nbsp;print(event)<br>\n}<br>\n<strong>OUTPUT: <br>\nnext(\"Hello Rx\") <br>\ncompleted</strong></code></pre>\n<p><em><strong>Observable sequences can emit</strong></em> <em><strong>zero</strong></em> <em><strong>or more events</strong></em> <em><strong>over their lifetimes. In</strong></em> <em><strong>RxSwift</strong></em> <em><strong>an</strong></em> <em><strong>Event</strong></em> <em><strong>is just an</strong></em> <em><strong>Enumeration Type</strong></em> <em><strong>with 3 possible states:</strong></em>&nbsp;</p>\n<ul>\n  <li><em><strong>.next(value: T) — </strong></em>When a value or collection of values is added to an observable sequence it will send the next event to its subscribers as seen above. The associated value will contain the actual value from the sequence.</li>\n  <li><em><strong>.error(error: Error) — </strong></em>If an Error is encountered, a sequence will emit an error event. This will also terminate the sequence.</li>\n  <li><em><strong>.completed</strong></em> <em><strong>—</strong></em> If a sequence ends normally it sends a completed event to its subscribers</li>\n</ul>\n<pre><code>let helloSequence = Observable.from([\"H\",\"e\",\"l\",\"l\",\"o\"])<br>\nlet subscription = helloSequence.subscribe { event in<br>\n &nbsp;switch event {&nbsp;&nbsp;<br>\n &nbsp;&nbsp;&nbsp;&nbsp;case .next(let value):<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(value)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .error(let error):<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(error)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .completed:<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"completed\")<br>\n &nbsp;}<br>\n}<br>\n<em><strong><br>\nOUTPUT:<br>\nH e l l o <br>\ncompleted</strong></em></code></pre>\n<p>If you want to cancel a subscription you can do that by calling dispose on it. You can also add the subscription to a Disposebagwhich will cancel the subscription for you automatically on deinit of the DisposeBag Instance. Another thing you can do is to subscribe just to a specific Event. For Example, if just want to receive the error events emitted by a sequence, you can use: subscribe(onError:(Error-&gt;())). This Code snippet will aggregate all the things you learned by now:</p>\n<pre><code>// Creating a DisposeBag so subscribtion will be cancelled correctly<br>\nlet bag = DisposeBag()<br>\n<br>\n// Creating an Observable Sequence that emits a String value<br>\nlet observable = Observable.just(\"Hello Rx!\")<br>\n<br>\n// Creating a subscription just for next events<br>\nlet subscription = observable.subscribe (onNext:{ <br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\n// Adding the Subscription to a Dispose Bag<br>\nsubscription.addDisposableTo(bag)</code></pre>\n<h2>Subjects 📫</h2>\n<p>A Subject is a special form of an Observable Sequence, you can subscribe and dynamically add elements to it. There are currently 4 different kinds of Subjects in RxSwift &nbsp;</p>\n<ul>\n  <li><strong>PublishSubject</strong>: If you subscribe to it you will get all the events that will happen after you subscribed.</li>\n  <li><strong>BehaviourSubject</strong>: A behavior subject will give any subscriber the most recent element and everything that is emitted by that sequence after the subscription happened.</li>\n  <li><strong>ReplaySubject</strong>: If you want to replay more than the most recent element to new subscribers on the initial subscription you need to use a ReplaySubject. With a ReplaySubject, you can define how many recent items you want to emit to new subscribers.</li>\n  <li><strong>Variable</strong>: A Variable is just a BehaviourSubject wrapper that feels more natural to a none reactive programmers. It can be used like a normal Variable.</li>\n</ul>\n<p>I’ll just show you how the PublishSubject works in this Article. If you want to know more about the other subject types, you need to take a look at the accompanying material on <a href=\"https://github.com/SebastianBoldt/Learn-and-Master-RxSwift\">GitHub</a>. They basically differ only in the number of past events emitted and received by their subscribers on initial subscription.</p>\n<blockquote><em><strong>Publish: 0</strong></em> <em><strong>Behaviour &amp; Variable: 1</strong></em> <em><strong>Replay: N</strong></em></blockquote>\n<p>Let’s take a look at the PublishSubject. The first thing we need to do is to create an actual PublishSubject instance. This is super easy, we can use the default initializer for that.</p>\n<pre><code>let bag = DisposeBag()<br>\nvar publishSubject = PublishSubject()</code></pre>\n<p>You can add new Values to that sequence by using the onNext() function. onCompleted() will complete the sequence and onError(error) will result in emitting an error event. Let’s add some values to our PublishSubject.</p>\n<pre><code>publishSubject.onNext(\"Hello\")<br>\npublishSubject.onNext(\"World\")</code></pre>\n<p>If you subscribe to that subject after adding “Hello” and “World” using onNext(), you won’t receive these two values through events. In contrast to a BehaviourSubject, that will receive “World”, which is the most recent event. Now let’s create a subscription and add some new values to the Subject. We also create a second subscription and add even more values to it. Please read the comments to understand what actually is going on.</p>\n<pre><code>let subscription1 = publishSubject.subscribe(onNext:{<br>\n &nbsp;print($0)<br>\n}).addDisposableTo(bag)<em><strong><br>\n<br>\n</strong></em>// Subscription1 receives these 2 events, Subscription2 won't<br>\n<br>\npublishSubject.onNext(\"Hello\")<br>\npublishSubject.onNext(\"Again\")<br>\n<br>\n<br>\n// Sub2 will not get \"Hello\" and \"Again\" because it susbcribed later<br>\nlet subscription2 = publishSubject.subscribe(onNext:{<br>\n &nbsp;print(#line,$0)<br>\n})<br>\n<br>\npublishSubject.onNext(\"Both Subscriptions receive this message\")</code></pre>\n<p>Congratulations 🎉. If you kept up reading to this point you should know the basics of RxSwift. There is a lot more to learn, but everything around Rx is based on these simple principles. You can take a short break now and play around with these concepts to fully understand them. If you are ready let us continue because there is a lot more interesting stuff to uncover.</p>\n<h2>Marble Diagrams 🙌🏼</h2>\n<p>If you work with RxSwift or Rx in general, you should get to know Marble Diagrams. A Marble Diagram visualizes the transformation of an observable sequence. It consists of the input stream on top, the output stream at the bottom and the actual transformation function in the middle. For Instance, let’s take look at an operation that delays your emitted events from an observable sequence by 150 milliseconds. Please ignore the scheduler parameter because I will introduce it later in the article: &nbsp;Easy to understand, right? There are great open source projects for both iOS and Android which allows you to interactively play around with these diagrams on your mobile devices. Play around with them and I promise you that you will learn a lot about Rx in a short amount of time. &nbsp;Web-App: <a href=\"http://rxmarbles.com/\">http://rxmarbles.com</a> &nbsp;iOS-App: <a href=\"https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8\">https://itunes.apple.com/com/app/rxmarbles/id1087272442</a> &nbsp;Android: <a href=\"https://goo.gl/b5YD8Kcontent_copy\">https://goo.gl/b5YD8K</a></p>\n<h2>Transformations ⚙️</h2>\n<p>Sometimes you want to transform, combine or filter the elements emitted by an observable sequence before the subscriber receives them. I will introduce you to the basic transformation operators, tell you something about Filters and possibilities to combine sequences. At last I will show you how to perform transformations, combinations etc. on different threads. Let’s get started.</p>\n<h3>4.1 Map</h3>\n<p>To transform Elements emitted from an observable Sequence, before they reach their subscribers, you use the <strong>map</strong> <strong>operator. Imagine a transformation that multiplies each value of a sequence with 10 before emitting.</strong>&nbsp;</p>\n<pre><code>Observable.of(1,2,3,4).map { value in <br>\n &nbsp;return value * 10<br>\n}.subscribe(onNext:{<br>\n &nbsp;print($0)<br>\n})<br>\n<strong>OUTPUT: 10 20 30 40</strong></code></pre>\n<h3><em><strong>4.2 FlatMap</strong></em></h3>\n<p>Imagine an Observable Sequence that consists of objects that are themselves Observables and you want to create a new Sequence from those. This is where FlatMap comes into play. FlatMap merges the emission of these resulting Observables and emitting these merged results as its own sequence. &nbsp;</p>\n<pre><code>let sequence1 &nbsp;= Observable.of(1,2)<br>\nlet sequence2 &nbsp;= Observable.of(1,2)<br>\n<br>\nlet sequenceOfSequences = Observable.of(sequence1,sequence2)<br>\nsequenceOfSequences.flatMap{ return $0 }.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<strong>OUTPUT: 1 2 1 2**</strong></code></pre>\n<h3>4.3 Scan</h3>\n<p>Scan starts with an initial seed value and is used to aggregate values just like reduce in Swift. &nbsp;</p>\n<pre><code>Observable.of(1,2,3,4,5).scan(0) { seed, value in<br>\n &nbsp;&nbsp;&nbsp;return seed + value<br>\n}.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\nOUTPUT: 1 3 6 10 15</code></pre>\n<h3>4.4 Buffer</h3>\n<p>The Buffer operator transforms an Observable that emits items into an Observable that emits buffered collections of those items. &nbsp;</p>\n<pre><code>SequenceThatEmitsWithDifferentIntervals<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.buffer(timeSpan: 150, count: 3, scheduler:s)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\n<br>\n<strong>OUTPUT: [1] [2,3] [4] [5,6] [7] []</strong></code></pre>\n<h2>5.Filter 🚬</h2>\n<p>If you only want to react on next events based on certain criteria you should use a filter operator.</p>\n<h3>5.1 Filter</h3>\n<p>The Basic filter Operation works similar to the swift equivalent. You just define a condition that needs to be passed and if the condition is fulfilled a .next event will be emitted to its subscribers. &nbsp;</p>\n<pre><code>Observable.of(2,30,22,5,60,1).filter{$0 &gt; 10}.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<strong>OUTPUT: 30 22 60</strong></code></pre>\n<h3>5.2 DistinctUntilChanged</h3>\n<p>If you just want to emit next Events if the value changed from previous ones you need to use distinctUntilChanged. &nbsp;</p>\n<pre><code>Observable.of(1,2,2,1,3).distinctUntilChanged().subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<strong>OUTPUT: 1 2 1 3</strong></code></pre>\n<p>Other filter operators you should try: &nbsp;</p>\n<ul>\n  <li>Debounce</li>\n  <li>TakeDuration</li>\n  <li>Skip</li>\n</ul>\n<h2>Combine 💑</h2>\n<p>Combining sequences is a common Task. RxSwift provides a lot of operators for you. Here are 3 of them:</p>\n<h3>6.1 StartWith</h3>\n<p>If you want an Observable to emit a specific sequence of items before it begins emitting the items normally expected from it, use the startWith operator. &nbsp;</p>\n<pre><code>Observable.of(2,3).startWith(1).subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<strong>OUTPUT: 1 2 3</strong></code></pre>\n<h3>6.2 Merge</h3>\n<p>You can combine the output of multiple Observables so that they act like a single Observable, by using the Merge operator. &nbsp;</p>\n<pre><code>let publish1 = PublishSubject()<br>\nlet publish2 = PublishSubject()<em><strong><br>\n<br>\n</strong></em>Observable.of(publish1,publish2).merge().subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\npublish1.onNext(20)<br>\npublish1.onNext(40)<br>\npublish1.onNext(60)<br>\npublish2.onNext(1)<br>\npublish1.onNext(80)<br>\npublish2.onNext(2)<br>\npublish1.onNext(100)<br>\n<strong>OUTPUT: 20 40 60 1 80 2 100</strong></code></pre>\n<h3>6.3 Zip</h3>\n<p>You use the Zip method if you want to merge items emitted by different observable sequences to one observable sequence. Zip will operate in strict sequence, so the first two elements emitted by Zip will be the first element of the first sequence and the first element of the second sequence combined. Keep also in Mind that Zip will only emit as many items as the number of items emitted of the source Observables that emits the fewest items. &nbsp;</p>\n<pre><code>let a = Observable.of(1,2,3,4,5)<br>\nlet b = Observable.of(\"a\",\"b\",\"c\",\"d\")<br>\n<br>\nObservable.zip(a,b){ return ($0,$1) }.subscribe {<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n}<br>\n<strong>OUTPUT: (1, \"a\")(2, \"b\") (3, \"c\") (4, \"d\")</strong></code></pre>\n<p>Other combination filters you should try:</p>\n<ul>\n  <li>Concat</li>\n  <li>CombineLatest</li>\n  <li>SwitchLatests</li>\n</ul>\n<h2>Side Effects 👉</h2>\n<p>If you want to register callbacks that will be executed when certain events take place on an Observable Sequence you need to use the doOn Operator. It will not modify the emitted elements but rather just pass them through. You can use …</p>\n<ul>\n  <li>do(onNext:) - if you want to do something just if a next event happened</li>\n  <li>do(onError:) - if errors will be emitted and</li>\n  <li>do(onCompleted:) - if the sequence finished successfully.</li>\n</ul>\n<pre><code>Observable.of(1,2,3,4,5).do(onNext: {<br>\n &nbsp;&nbsp;&nbsp;$0 * 10 *// This has no effect on the actual subscription<br>\n*}).subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})</code></pre>\n<h2>8.Schedulers ⏰</h2>\n<p><a href=\"https://goo.gl/b5YD8Kcontent_copy\">Operators will work on the same thread as where the subscription is created. In RxSwift you use schedulers to force operators do their work on a specific queue. You can also force that the subscription should happen on a specifc Queue. You use subscribeOnand observeOn for those tasks. If you are familiar with the concept of operation-queues or dispatch-queues this should be nothing special for you. A scheduler can be serial or concurrent similar to GCD or OperationQueue. There are 5 Types of Schedulers in RxSwift:</a>&nbsp;</p>\n<ul>\n  <li><strong>MainScheduler</strong> — “Abstracts work that needs to be performed on MainThread. In case schedule methods are called from the main thread, it will perform the action immediately without scheduling.This scheduler is usually used to perform UI work.”</li>\n  <li><strong>CurrentThreadScheduler</strong> — “Schedules units of work on the current thread. This is the default scheduler for operators that generate elements.”</li>\n  <li><strong>SerialDispatchQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific dispatchqueuet. It will make sure that even if a concurrent dispatch queue is passed, it's transformed into a serial one.Serial schedulers enable certain optimizations for observeOn.The main scheduler is an instance of SerialDispatchQueueScheduler\"</li>\n  <li><strong>ConcurrentDispatchQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific dispatchqueuet. You can also pass a serial dispatch queue, it shouldn't cause any problems. This scheduler is suitable when some work needs to be performed in the background.”</li>\n  <li><strong>OperationQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific NSOperationQueue. This scheduler is suitable for cases when there is some bigger chunk of work that needs to be performed in the background and you want to fine tune concurrent processing using maxConcurrentOperationCount.”</li>\n</ul>\n<p>Here is a code snippet that shows you how to observe something concurrently on a background queue und subscribe on the main-queue.</p>\n<pre><code>let publish1 = PublishSubject()<br>\nlet publish2 = PublishSubject()<br>\n<br>\nlet concurrentScheduler = ConcurrentDispatchQueueScheduler(qos: .background)<br>\nObservable.of(publish1,publish2)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.observeOn(concurrentScheduler)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.merge()<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribeOn(MainScheduler())<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\npublish1.onNext(20)<br>\npublish1.onNext(40)<br>\n<strong>OUTPUT: 20 40&nbsp;</strong></code></pre>\n<h2>It’s a wrap 🎁</h2>\n<p>Congratulation, you learned the basics of RxSwift. Happy Coding 🎉 Learn &amp; Master RxCocoa will be coming soon … Feel free to add me on <a href=\"https://github.com/SebastianBoldt\">github</a>, <a href=\"https://twitter.com/sebastianboldt\">twitter</a>, <a href=\"https://de.linkedin.com/in/sebastian-boldt-9b465261\">linkedin</a> or <a href=\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\">xing</a> if you have any questions. If you like electronic music you can also listen to my Tracks on <a href=\"https://soundcloud.com/sebastian_boldt\">SoundCloud</a> ;) <a href=\"https://github.com/SebastianBoldt\">SebastianBoldt (Sebastian Boldt) · GitHub SebastianBoldt has 14 repositories available. Follow their code on GitHub.github.com</a> &nbsp;SOURCES:</p>\n<ul>\n  <li><a href=\"https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md\">https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md</a></li>\n  <li><a href=\"http://reactivex.io/documentation/operators.html\">http://reactivex.io/documentation/operators.html</a></li>\n  <li><a href=\"http://rxmarbles.com/\">http://rxmarbles.com</a></li>\n</ul>\n</html>",
      "json_metadata": "{\"tags\":[\"programming\",\"rxswift\",\"ios\",\"swift\"],\"links\":[\"https://developer.apple.com/reference/swift/sequence\",\"https://github.com/SebastianBoldt/Learn-and-Master-RxSwift\",\"http://rxmarbles.com/\",\"https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8\",\"https://goo.gl/b5YD8Kcontent_copy\",\"https://github.com/SebastianBoldt\",\"https://twitter.com/sebastianboldt\",\"https://de.linkedin.com/in/sebastian-boldt-9b465261\",\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\",\"https://soundcloud.com/sebastian_boldt\",\"https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md\",\"http://reactivex.io/documentation/operators.html\"],\"app\":\"steemit/0.1\",\"format\":\"html\"}"
    }
  ]
}
2017/11/10 17:56:30
parent authorsebastianboldt
parent permlink7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
authorbeerbot
permlinkre-7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes-20171110t175630
title
body **Hello & Cheers!!** I'm a content detection and information bot. You are receiving this reply because a short link or links have been detected in your post/comment. The purpose of this message is to inform your readers and yourself about the use of and dangers of short links. **To the readers of the post:** Short links are provided by [url shortening](https://en.wikipedia.org/wiki/URL_shortening) services. The short links they provide can be useful in some cases. Generally their use is benign. But as with all useful tools there are dangers. Short links can be used to hide all sorts of things. Quite frequently they are used to hide referral links for instance. While not dangerous this can be deceptive. They can also be used to hide dangerous links such as links to phishing sites, sites loaded with malware, scam sites, etc. You should always be extremely cautious before clicking on one. If you don't know and trust the poster don't click. Even if you do you should still be cautious and wary of any site you are sent to. It's always better to visit the site directly and not through a short link. **To the author of the post:** While short links may be useful on some sites they are not needed on steemit. You can use markdown to format your links such as this link to [steemit](https://steemit.com). It's as simple as `[steemit](https://steemit.com)` Unlike short links this allows the reader to see where they are going by simply hovering over the link before they click on it. | | | | ---- | ---- | | <sup><sub>This message was created by a bot. It is part of the ongoing fight against spam and phishing attacks on steemit. If you did not use short links in your post and feel you have received this message in error you can contact @fubar-bdhr on discord or @fubar.bdhr on steemit chat to report the issue.</sub></sup> |![](https://steemitimages.com/DQmPaR3USbBnbvB4j69Ffh2wPJYnJSoF6BSTgdJ71QVRoJP/image.png) |
json metadata{"app": "pysteem/0.5.6"}
Transaction InfoBlock #17106077/Trx 2b498ce69fdaa99d82ada724ee956b923a811533
View Raw JSON Data
{
  "trx_id": "2b498ce69fdaa99d82ada724ee956b923a811533",
  "block": 17106077,
  "trx_in_block": 20,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T17:56:30",
  "op": [
    "comment",
    {
      "parent_author": "sebastianboldt",
      "parent_permlink": "7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "author": "beerbot",
      "permlink": "re-7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes-20171110t175630",
      "title": "",
      "body": "\n\n**Hello & Cheers!!** I'm a content detection and information bot.  You are receiving this reply because a short link or links have been detected in your post/comment.  The purpose of this message is to inform your readers and yourself about the use of and dangers of short links.\n\n**To the readers of the post:**  Short links are provided by [url shortening](https://en.wikipedia.org/wiki/URL_shortening) services.  The short links they provide can be useful in some cases.  Generally their use is benign.  But as with all useful tools there are dangers.  Short links can be used to hide all sorts of things.  Quite frequently they are used to hide referral links for instance.  While not dangerous this can be deceptive.  They can also be used to hide dangerous links such as links to phishing sites, sites loaded with malware, scam sites, etc.  You should always be extremely cautious before clicking on one.  If you don't know and trust the poster don't click.  Even if you do you should still be cautious and wary of any site you are sent to. It's always better to visit the site directly and not through a short link.  \n\n**To the author of the post:**  While short links may be useful on some sites they are not needed on steemit.  You can use markdown to format your links such as this link to [steemit](https://steemit.com).  It's as simple as `[steemit](https://steemit.com)`  Unlike short links this allows the reader to see where they are going by simply hovering over the link before they click on it.  \n\n|     |   |  \n| ---- | ---- |\n| <sup><sub>This message was created by a bot.  It is part of the ongoing fight against spam and phishing attacks on steemit.  If you did not use short links in your post and feel you have received this message in error you can contact @fubar-bdhr on discord or @fubar.bdhr on steemit chat to report the issue.</sub></sup> |![](https://steemitimages.com/DQmPaR3USbBnbvB4j69Ffh2wPJYnJSoF6BSTgdJ71QVRoJP/image.png) |",
      "json_metadata": "{\"app\": \"pysteem/0.5.6\"}"
    }
  ]
}
2017/11/10 17:55:39
parent author
parent permlinkprogramming
authorsebastianboldt
permlink7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
titleLearn & Master ⚔️ the Basics of RxSwift in 10 Minutes
body<html> <p>Every programmer should have heard of <em>Rx</em>. Whether it happened at the last developer conference or while reading a fresh blog article like this one 😎. It is almost impossible not to have heard of it, but what exactly is Reactive Programming? Let’s take a look on the Internet:</p> <blockquote>In computing, <strong>reactive programming</strong> is a programming paradigm oriented around data flows and the propagation of change. This means that it should be possible to express static or dynamic data flows with ease in the programming languages used, and that the underlying execution model will automatically propagate changes through the data flow. — Wikipedia</blockquote> <p>I am honest, after reading this paragraph, most people will have no idea what reactive programming actually is, so do I. This is the reason why I will try to create a simple, easy to understand Introduction for this modern approach to software development using the Swift Version of Rx: <strong>RxSwift</strong>.<br> </p> <h2><strong>1. Observable Sequences 🎞</strong></h2> <p>The first thing you need to understand is that everything in <em><strong>RxSwift</strong></em> <em><strong>is an</strong></em> <em><strong>observable sequence</strong></em> <em><strong>or something that operates on or subscribes to events emitted by an</strong></em> <em><strong>observable sequence.</strong></em><br> <em><strong>Arrays,</strong></em> <em><strong>Strings or Dictionaries</strong></em> <em><strong>will be converted to</strong></em> <em><strong>observable sequences</strong></em> <em><strong>in</strong></em> <em><strong>RxSwift. You can create an</strong></em> <em><strong>observable sequence</strong></em> <em><strong>of any Object that conforms to the</strong></em> <a href="https://developer.apple.com/reference/swift/sequence"><em><strong>Sequence</strong></em> <em><strong>Protocol</strong></em></a> <strong>from the Swift Standard Library.</strong><br> <strong>Let’s create some observable sequences:</strong></p> <pre><code>let helloSequence = Observable.just("Hello Rx")<br> let fibonacciSequence = Observable.from([0,1,1,2,3,5,8])<br> let dictSequence = Observable.from([1:"Hello",2:"World"])</code></pre> <p><strong>You subscribe to observable sequences by calling</strong> <em>subscribe(on:(Event)-&gt; ())</em><em><strong>. The passed block will receive all events emitted by that sequence.</strong></em></p> <pre><code>let helloSequence = Observable.of("Hello Rx")<br> let subscription = helloSequence.subscribe { event in<br> &nbsp;print(event)<br> }</code></pre> <pre><code><strong>OUTPUT: <br> next("Hello Rx") <br> completed</strong></code></pre> <p><em><strong>Observable sequences can emit</strong></em> <em><strong>zero</strong></em> <em><strong>or more events</strong></em> <em><strong>over their lifetimes. In</strong></em> <em><strong>RxSwift</strong></em> <em><strong>an</strong></em> <em><strong>Event</strong></em> <em><strong>is just an</strong></em> <em><strong>Enumeration Type</strong></em> <em><strong>with 3 possible states:</strong></em><br> </p> <ul> <li><em><strong>.next(value: T) — </strong></em>When a value or collection of values is added to an observable sequence it will send the next event to its subscribers as seen above. The associated value will contain the actual value from the sequence.</li> <li><em><strong>.error(error: Error) — </strong></em>If an Error is encountered, a sequence will emit an error event. This will also terminate the sequence.</li> <li><em><strong>.completed</strong></em> <em><strong>—</strong></em> If a sequence ends normally it sends a completed event to its subscribers</li> </ul> <pre><code>let helloSequence = Observable.from(["H","e","l","l","o"])<br> let subscription = helloSequence.subscribe { event in<br> &nbsp;switch event {&nbsp;&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;case .next(let value):<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(value)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .error(let error):<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(error)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .completed:<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("completed")<br> &nbsp;}<br> }</code></pre> <pre><code><em><strong><br> OUTPUT:<br> H e l l o <br> completed</strong></em></code></pre> <p>If you want to cancel a subscription you can do that by calling dispose on it. You can also add the subscription to a Disposebagwhich will cancel the subscription for you automatically on deinit of the DisposeBag Instance. Another thing you can do is to subscribe just to a specific Event. For Example, if just want to receive the error events emitted by a sequence, you can use: subscribe(onError:(Error-&gt;())).<br> This Code snippet will aggregate all the things you learned by now:</p> <pre><code>// Creating a DisposeBag so subscribtion will be cancelled correctly<br> let bag = DisposeBag()<br> <br> // Creating an Observable Sequence that emits a String value<br> let observable = Observable.just("Hello Rx!")<br> <br> // Creating a subscription just for next events<br> let subscription = observable.subscribe (onNext:{ <br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> // Adding the Subscription to a Dispose Bag<br> subscription.addDisposableTo(bag)</code></pre> <h2>Subjects 📫</h2> <p>A Subject is a special form of an Observable Sequence, you can subscribe and dynamically add elements to it. There are currently 4 different kinds of Subjects in RxSwift<br> </p> <ul> <li><strong>PublishSubject</strong>: If you subscribe to it you will get all the events that will happen after you subscribed.</li> <li><strong>BehaviourSubject</strong>: A behavior subject will give any subscriber the most recent element and everything that is emitted by that sequence after the subscription happened.</li> <li><strong>ReplaySubject</strong>: If you want to replay more than the most recent element to new subscribers on the initial subscription you need to use a ReplaySubject. With a ReplaySubject, you can define how many recent items you want to emit to new subscribers.</li> <li><strong>Variable</strong>: A Variable is just a BehaviourSubject wrapper that feels more natural to a none reactive programmers. It can be used like a normal Variable.</li> </ul> <p>I’ll just show you how the PublishSubject works in this Article. If you want to know more about the other subject types, you need to take a look at the accompanying material on <a href="https://github.com/SebastianBoldt/Learn-and-Master-RxSwift">GitHub</a>. They basically differ only in the number of past events emitted and received by their subscribers on initial subscription.</p> <blockquote><em><strong>Publish: 0</strong></em><br> <em><strong>Behaviour &amp; Variable: 1</strong></em><br> <em><strong>Replay: N</strong></em></blockquote> <p>Let’s take a look at the PublishSubject.<br> The first thing we need to do is to create an actual PublishSubject instance. This is super easy, we can use the default initializer for that.</p> <pre><code>let bag = DisposeBag()<br> var publishSubject = PublishSubject()</code></pre> <p>You can add new Values to that sequence by using the onNext() function. onCompleted() will complete the sequence and onError(error) will result in emitting an error event. Let’s add some values to our PublishSubject.</p> <pre><code>publishSubject.onNext("Hello")<br> publishSubject.onNext("World")</code></pre> <p>If you subscribe to that subject after adding “Hello” and “World” using onNext(), you won’t receive these two values through events. In contrast to a BehaviourSubject, that will receive “World”, which is the most recent event.<br> Now let’s create a subscription and add some new values to the Subject. We also create a second subscription and add even more values to it. Please read the comments to understand what actually is going on.</p> <pre><code>let subscription1 = publishSubject.subscribe(onNext:{<br> &nbsp;print($0)<br> }).addDisposableTo(bag)<em><strong><br> <br> </strong></em>// Subscription1 receives these 2 events, Subscription2 won't<br> <br> publishSubject.onNext("Hello")<br> publishSubject.onNext("Again")<br> <br> <br> // Sub2 will not get "Hello" and "Again" because it susbcribed later<br> let subscription2 = publishSubject.subscribe(onNext:{<br> &nbsp;print(#line,$0)<br> })<br> <br> publishSubject.onNext("Both Subscriptions receive this message")</code></pre> <p>Congratulations 🎉. If you kept up reading to this point you should know the basics of RxSwift. There is a lot more to learn, but everything around Rx is based on these simple principles. You can take a short break now and play around with these concepts to fully understand them. If you are ready let us continue because there is a lot more interesting stuff to uncover.</p> <h2>Marble Diagrams 🙌🏼</h2> <p>If you work with RxSwift or Rx in general, you should get to know Marble Diagrams. A Marble Diagram visualizes the transformation of an observable sequence. It consists of the input stream on top, the output stream at the bottom and the actual transformation function in the middle.<br> For Instance, let’s take look at an operation that delays your emitted events from an observable sequence by 150 milliseconds. Please ignore the scheduler parameter because I will introduce it later in the article:<br> <br> Easy to understand, right?<br> There are great open source projects for both iOS and Android which allows you to interactively play around with these diagrams on your mobile devices. Play around with them and I promise you that you will learn a lot about Rx in a short amount of time.<br> <br> Web-App: <a href="http://rxmarbles.com/">http://rxmarbles.com</a> <br> iOS-App: <a href="https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8">https://itunes.apple.com/com/app/rxmarbles/id1087272442</a> <br> Android: <a href="https://goo.gl/b5YD8Kcontent_copy">https://goo.gl/b5YD8K</a></p> <h2>Transformations ⚙️</h2> <p>Sometimes you want to transform, combine or filter the elements emitted by an observable sequence before the subscriber receives them. I will introduce you to the basic transformation operators, tell you something about Filters and possibilities to combine sequences. At last I will show you how to perform transformations, combinations etc. on different threads. Let’s get started.</p> <h3>4.1 Map</h3> <p>To transform Elements emitted from an observable Sequence, before they reach their subscribers, you use the <strong>map</strong> <strong>operator. Imagine a transformation that multiplies each value of a sequence with 10 before emitting.</strong><br> </p> <pre><code>Observable.of(1,2,3,4).map { value in <br> &nbsp;return value * 10<br> }.subscribe(onNext:{<br> &nbsp;print($0)<br> })</code></pre> <pre><code><strong>OUTPUT: 10 20 30 40</strong></code></pre> <h3><em><strong>4.2 FlatMap</strong></em></h3> <p>Imagine an Observable Sequence that consists of objects that are themselves Observables and you want to create a new Sequence from those. This is where FlatMap comes into play. FlatMap merges the emission of these resulting Observables and emitting these merged results as its own sequence.<br> </p> <pre><code>let sequence1 &nbsp;= Observable.of(1,2)<br> let sequence2 &nbsp;= Observable.of(1,2)<br> <br> let sequenceOfSequences = Observable.of(sequence1,sequence2)<br> sequenceOfSequences.flatMap{ return $0 }.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })</code></pre> <pre><code><strong>OUTPUT: 1 2 1 2**</strong></code></pre> <h3>4.3 Scan</h3> <p>Scan starts with an initial seed value and is used to aggregate values just like reduce in Swift.<br> </p> <pre><code>Observable.of(1,2,3,4,5).scan(0) { seed, value in<br> &nbsp;&nbsp;&nbsp;return seed + value<br> }.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })</code></pre> <pre><code>OUTPUT: 1 3 6 10 15</code></pre> <h3>4.4 Buffer</h3> <p>The Buffer operator transforms an Observable that emits items into an Observable that emits buffered collections of those items.<br> </p> <pre><code>SequenceThatEmitsWithDifferentIntervals<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.buffer(timeSpan: 150, count: 3, scheduler:s)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> </code></pre> <pre><code><strong>OUTPUT: [1] [2,3] [4] [5,6] [7] []</strong></code></pre> <h2>5.Filter 🚬</h2> <p>If you only want to react on next events based on certain criteria you should use a filter operator.</p> <h3>5.1 Filter</h3> <p>The Basic filter Operation works similar to the swift equivalent. You just define a condition that needs to be passed and if the condition is fulfilled a .next event will be emitted to its subscribers.<br> </p> <pre><code>Observable.of(2,30,22,5,60,1).filter{$0 &gt; 10}.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print($0)<br> })</code></pre> <pre><code><strong>OUTPUT: 30 22 60</strong></code></pre> <h3>5.2 DistinctUntilChanged</h3> <p>If you just want to emit next Events if the value changed from previous ones you need to use distinctUntilChanged.<br> </p> <pre><code>Observable.of(1,2,2,1,3).distinctUntilChanged().subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })</code></pre> <pre><code><strong>OUTPUT: 1 2 1 3</strong></code></pre> <p>Other filter operators you should try:<br> </p> <ul> <li>Debounce</li> <li>TakeDuration</li> <li>Skip</li> </ul> <h2>Combine 💑</h2> <p>Combining sequences is a common Task. RxSwift provides a lot of operators for you. Here are 3 of them:</p> <h3>6.1 StartWith</h3> <p>If you want an Observable to emit a specific sequence of items before it begins emitting the items normally expected from it, use the startWith operator.<br> </p> <pre><code>Observable.of(2,3).startWith(1).subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })</code></pre> <pre><code><strong>OUTPUT: 1 2 3</strong></code></pre> <h3>6.2 Merge</h3> <p>You can combine the output of multiple Observables so that they act like a single Observable, by using the Merge operator.<br> </p> <pre><code>let publish1 = PublishSubject()<br> let publish2 = PublishSubject()<em><strong><br> <br> </strong></em>Observable.of(publish1,publish2).merge().subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> publish1.onNext(20)<br> publish1.onNext(40)<br> publish1.onNext(60)<br> publish2.onNext(1)<br> publish1.onNext(80)<br> publish2.onNext(2)<br> publish1.onNext(100)</code></pre> <pre><code><strong>OUTPUT: 20 40 60 1 80 2 100</strong></code></pre> <h3>6.3 Zip</h3> <p>You use the Zip method if you want to merge items emitted by different observable sequences to one observable sequence. Zip will operate in strict sequence, so the first two elements emitted by Zip will be the first element of the first sequence and the first element of the second sequence combined. Keep also in Mind that Zip will only emit as many items as the number of items emitted of the source Observables that emits the fewest items.<br> </p> <pre><code>let a = Observable.of(1,2,3,4,5)<br> let b = Observable.of("a","b","c","d")<br> <br> Observable.zip(a,b){ return ($0,$1) }.subscribe {<br> &nbsp;&nbsp;&nbsp;print($0)<br> }</code></pre> <pre><code><strong>OUTPUT: (1, "a")(2, "b") (3, "c") (4, "d")</strong></code></pre> <p>Other combination filters you should try:</p> <ul> <li>Concat</li> <li>CombineLatest</li> <li>SwitchLatests</li> </ul> <h2>Side Effects 👉</h2> <p>If you want to register callbacks that will be executed when certain events take place on an Observable Sequence you need to use the doOn Operator. It will not modify the emitted elements but rather just pass them through. You can use …</p> <ul> <li>do(onNext:) - if you want to do something just if a next event happened</li> <li>do(onError:) - if errors will be emitted and</li> <li>do(onCompleted:) - if the sequence finished successfully.</li> </ul> <pre><code>Observable.of(1,2,3,4,5).do(onNext: {<br> &nbsp;&nbsp;&nbsp;$0 * 10 *// This has no effect on the actual subscription<br> *}).subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })</code></pre> <h2>8.Schedulers ⏰</h2> <p><a href="https://goo.gl/b5YD8Kcontent_copy">Operators will work on the same thread as where the subscription is created. In RxSwift you use schedulers to force operators do their work on a specific queue. You can also force that the subscription should happen on a specifc Queue. You use subscribeOnand observeOn for those tasks. If you are familiar with the concept of operation-queues or dispatch-queues this should be nothing special for you. A scheduler can be serial or concurrent similar to GCD or OperationQueue. There are 5 Types of Schedulers in RxSwift:</a><br> </p> <ul> <li><strong>MainScheduler</strong> — “Abstracts work that needs to be performed on MainThread. In case schedule methods are called from the main thread, it will perform the action immediately without scheduling.This scheduler is usually used to perform UI work.”</li> <li><strong>CurrentThreadScheduler</strong> — “Schedules units of work on the current thread. This is the default scheduler for operators that generate elements.”</li> <li><strong>SerialDispatchQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific dispatchqueuet. It will make sure that even if a concurrent dispatch queue is passed, it's transformed into a serial one.Serial schedulers enable certain optimizations for observeOn.The main scheduler is an instance of SerialDispatchQueueScheduler"</li> <li><strong>ConcurrentDispatchQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific dispatchqueuet. You can also pass a serial dispatch queue, it shouldn't cause any problems. This scheduler is suitable when some work needs to be performed in the background.”</li> <li><strong>OperationQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific NSOperationQueue. This scheduler is suitable for cases when there is some bigger chunk of work that needs to be performed in the background and you want to fine tune concurrent processing using maxConcurrentOperationCount.”</li> </ul> <p>Here is a code snippet that shows you how to observe something concurrently on a background queue und subscribe on the main-queue.</p> <pre><code>let publish1 = PublishSubject()<br> let publish2 = PublishSubject()<br> <br> let concurrentScheduler = ConcurrentDispatchQueueScheduler(qos: .background)<br> Observable.of(publish1,publish2)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.observeOn(concurrentScheduler)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.merge()<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribeOn(MainScheduler())<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> publish1.onNext(20)<br> publish1.onNext(40)</code></pre> <pre><code><strong>OUTPUT: 20 40&nbsp;</strong></code></pre> <h2>It’s a wrap 🎁</h2> <p>Congratulation, you learned the basics of RxSwift. Happy Coding 🎉<br> Learn &amp; Master RxCocoa will be coming soon …<br> Feel free to add me on <a href="https://github.com/SebastianBoldt">github</a>, <a href="https://twitter.com/sebastianboldt">twitter</a>, <a href="https://de.linkedin.com/in/sebastian-boldt-9b465261">linkedin</a> or <a href="https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p">xing</a> if you have any questions. If you like electronic music you can also listen to my Tracks on <a href="https://soundcloud.com/sebastian_boldt">SoundCloud</a> ;) <a href="https://github.com/SebastianBoldt">SebastianBoldt (Sebastian Boldt) · GitHub SebastianBoldt has 14 repositories available. Follow their code on GitHub.github.com</a><br> <br> SOURCES:</p> <ul> <li><a href="https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md">https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md</a></li> <li><a href="http://reactivex.io/documentation/operators.html">http://reactivex.io/documentation/operators.html</a></li> <li><a href="http://rxmarbles.com/">http://rxmarbles.com</a></li> </ul> </html>
json metadata{"tags":["programming","rxswift","ios","swift"],"links":["https://developer.apple.com/reference/swift/sequence","https://github.com/SebastianBoldt/Learn-and-Master-RxSwift","http://rxmarbles.com/","https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8","https://goo.gl/b5YD8Kcontent_copy","https://github.com/SebastianBoldt","https://twitter.com/sebastianboldt","https://de.linkedin.com/in/sebastian-boldt-9b465261","https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p","https://soundcloud.com/sebastian_boldt","https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md","http://reactivex.io/documentation/operators.html"],"app":"steemit/0.1","format":"html"}
Transaction InfoBlock #17106060/Trx 322c3b8f6f45f7247f5cd0e86d8a23d3016c8e28
View Raw JSON Data
{
  "trx_id": "322c3b8f6f45f7247f5cd0e86d8a23d3016c8e28",
  "block": 17106060,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T17:55:39",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "programming",
      "author": "sebastianboldt",
      "permlink": "7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "title": "Learn & Master ⚔️ the Basics of RxSwift in 10 Minutes",
      "body": "<html>\n<p>Every programmer should have heard of <em>Rx</em>. Whether it happened at the last developer conference or while reading a fresh blog article like this one 😎. It is almost impossible not to have heard of it, but what exactly is Reactive Programming? Let’s take a look on the Internet:</p>\n<blockquote>In computing, <strong>reactive programming</strong> is a programming paradigm oriented around data flows and the propagation of change. This means that it should be possible to express static or dynamic data flows with ease in the programming languages used, and that the underlying execution model will automatically propagate changes through the data flow. — Wikipedia</blockquote>\n<p>I am honest, after reading this paragraph, most people will have no idea what reactive programming actually is, so do I. This is the reason why I will try to create a simple, easy to understand Introduction for this modern approach to software development using the Swift Version of Rx: <strong>RxSwift</strong>.<br>\n</p>\n<h2><strong>1. Observable Sequences 🎞</strong></h2>\n<p>The first thing you need to understand is that everything in <em><strong>RxSwift</strong></em> <em><strong>is an</strong></em> <em><strong>observable sequence</strong></em> <em><strong>or something that operates on or subscribes to events emitted by an</strong></em> <em><strong>observable sequence.</strong></em><br>\n<em><strong>Arrays,</strong></em> <em><strong>Strings or Dictionaries</strong></em> <em><strong>will be converted to</strong></em> <em><strong>observable sequences</strong></em> <em><strong>in</strong></em> <em><strong>RxSwift. You can create an</strong></em> <em><strong>observable sequence</strong></em> <em><strong>of any Object that conforms to the</strong></em> <a href=\"https://developer.apple.com/reference/swift/sequence\"><em><strong>Sequence</strong></em> <em><strong>Protocol</strong></em></a> <strong>from the Swift Standard Library.</strong><br>\n<strong>Let’s create some observable sequences:</strong></p>\n<pre><code>let helloSequence = Observable.just(\"Hello Rx\")<br>\nlet fibonacciSequence = Observable.from([0,1,1,2,3,5,8])<br>\nlet dictSequence = Observable.from([1:\"Hello\",2:\"World\"])</code></pre>\n<p><strong>You subscribe to observable sequences by calling</strong> <em>subscribe(on:(Event)-&gt; ())</em><em><strong>. The passed block will receive all events emitted by that sequence.</strong></em></p>\n<pre><code>let helloSequence = Observable.of(\"Hello Rx\")<br>\nlet subscription = helloSequence.subscribe { event in<br>\n &nbsp;print(event)<br>\n}</code></pre>\n<pre><code><strong>OUTPUT: <br>\nnext(\"Hello Rx\") <br>\ncompleted</strong></code></pre>\n<p><em><strong>Observable sequences can emit</strong></em> <em><strong>zero</strong></em> <em><strong>or more events</strong></em> <em><strong>over their lifetimes. In</strong></em> <em><strong>RxSwift</strong></em> <em><strong>an</strong></em> <em><strong>Event</strong></em> <em><strong>is just an</strong></em> <em><strong>Enumeration Type</strong></em> <em><strong>with 3 possible states:</strong></em><br>\n</p>\n<ul>\n  <li><em><strong>.next(value: T) — </strong></em>When a value or collection of values is added to an observable sequence it will send the next event to its subscribers as seen above. The associated value will contain the actual value from the sequence.</li>\n  <li><em><strong>.error(error: Error) — </strong></em>If an Error is encountered, a sequence will emit an error event. This will also terminate the sequence.</li>\n  <li><em><strong>.completed</strong></em> <em><strong>—</strong></em> If a sequence ends normally it sends a completed event to its subscribers</li>\n</ul>\n<pre><code>let helloSequence = Observable.from([\"H\",\"e\",\"l\",\"l\",\"o\"])<br>\nlet subscription = helloSequence.subscribe { event in<br>\n &nbsp;switch event {&nbsp;&nbsp;<br>\n &nbsp;&nbsp;&nbsp;&nbsp;case .next(let value):<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(value)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .error(let error):<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(error)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .completed:<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"completed\")<br>\n &nbsp;}<br>\n}</code></pre>\n<pre><code><em><strong><br>\nOUTPUT:<br>\nH e l l o <br>\ncompleted</strong></em></code></pre>\n<p>If you want to cancel a subscription you can do that by calling dispose on it. You can also add the subscription to a Disposebagwhich will cancel the subscription for you automatically on deinit of the DisposeBag Instance. Another thing you can do is to subscribe just to a specific Event. For Example, if just want to receive the error events emitted by a sequence, you can use: subscribe(onError:(Error-&gt;())).<br>\nThis Code snippet will aggregate all the things you learned by now:</p>\n<pre><code>// Creating a DisposeBag so subscribtion will be cancelled correctly<br>\nlet bag = DisposeBag()<br>\n<br>\n// Creating an Observable Sequence that emits a String value<br>\nlet observable = Observable.just(\"Hello Rx!\")<br>\n<br>\n// Creating a subscription just for next events<br>\nlet subscription = observable.subscribe (onNext:{ <br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\n// Adding the Subscription to a Dispose Bag<br>\nsubscription.addDisposableTo(bag)</code></pre>\n<h2>Subjects 📫</h2>\n<p>A Subject is a special form of an Observable Sequence, you can subscribe and dynamically add elements to it. There are currently 4 different kinds of Subjects in RxSwift<br>\n</p>\n<ul>\n  <li><strong>PublishSubject</strong>: If you subscribe to it you will get all the events that will happen after you subscribed.</li>\n  <li><strong>BehaviourSubject</strong>: A behavior subject will give any subscriber the most recent element and everything that is emitted by that sequence after the subscription happened.</li>\n  <li><strong>ReplaySubject</strong>: If you want to replay more than the most recent element to new subscribers on the initial subscription you need to use a ReplaySubject. With a ReplaySubject, you can define how many recent items you want to emit to new subscribers.</li>\n  <li><strong>Variable</strong>: A Variable is just a BehaviourSubject wrapper that feels more natural to a none reactive programmers. It can be used like a normal Variable.</li>\n</ul>\n<p>I’ll just show you how the PublishSubject works in this Article. If you want to know more about the other subject types, you need to take a look at the accompanying material on <a href=\"https://github.com/SebastianBoldt/Learn-and-Master-RxSwift\">GitHub</a>. They basically differ only in the number of past events emitted and received by their subscribers on initial subscription.</p>\n<blockquote><em><strong>Publish: 0</strong></em><br>\n<em><strong>Behaviour &amp; Variable: 1</strong></em><br>\n<em><strong>Replay: N</strong></em></blockquote>\n<p>Let’s take a look at the PublishSubject.<br>\nThe first thing we need to do is to create an actual PublishSubject instance. This is super easy, we can use the default initializer for that.</p>\n<pre><code>let bag = DisposeBag()<br>\nvar publishSubject = PublishSubject()</code></pre>\n<p>You can add new Values to that sequence by using the onNext() function. onCompleted() will complete the sequence and onError(error) will result in emitting an error event. Let’s add some values to our PublishSubject.</p>\n<pre><code>publishSubject.onNext(\"Hello\")<br>\npublishSubject.onNext(\"World\")</code></pre>\n<p>If you subscribe to that subject after adding “Hello” and “World” using onNext(), you won’t receive these two values through events. In contrast to a BehaviourSubject, that will receive “World”, which is the most recent event.<br>\nNow let’s create a subscription and add some new values to the Subject. We also create a second subscription and add even more values to it. Please read the comments to understand what actually is going on.</p>\n<pre><code>let subscription1 = publishSubject.subscribe(onNext:{<br>\n &nbsp;print($0)<br>\n}).addDisposableTo(bag)<em><strong><br>\n<br>\n</strong></em>// Subscription1 receives these 2 events, Subscription2 won't<br>\n<br>\npublishSubject.onNext(\"Hello\")<br>\npublishSubject.onNext(\"Again\")<br>\n<br>\n<br>\n// Sub2 will not get \"Hello\" and \"Again\" because it susbcribed later<br>\nlet subscription2 = publishSubject.subscribe(onNext:{<br>\n &nbsp;print(#line,$0)<br>\n})<br>\n<br>\npublishSubject.onNext(\"Both Subscriptions receive this message\")</code></pre>\n<p>Congratulations 🎉. If you kept up reading to this point you should know the basics of RxSwift. There is a lot more to learn, but everything around Rx is based on these simple principles. You can take a short break now and play around with these concepts to fully understand them. If you are ready let us continue because there is a lot more interesting stuff to uncover.</p>\n<h2>Marble Diagrams 🙌🏼</h2>\n<p>If you work with RxSwift or Rx in general, you should get to know Marble Diagrams. A Marble Diagram visualizes the transformation of an observable sequence. It consists of the input stream on top, the output stream at the bottom and the actual transformation function in the middle.<br>\nFor Instance, let’s take look at an operation that delays your emitted events from an observable sequence by 150 milliseconds. Please ignore the scheduler parameter because I will introduce it later in the article:<br>\n<br>\nEasy to understand, right?<br>\nThere are great open source projects for both iOS and Android which allows you to interactively play around with these diagrams on your mobile devices. Play around with them and I promise you that you will learn a lot about Rx in a short amount of time.<br>\n<br>\nWeb-App: <a href=\"http://rxmarbles.com/\">http://rxmarbles.com</a> <br>\niOS-App: <a href=\"https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8\">https://itunes.apple.com/com/app/rxmarbles/id1087272442</a> <br>\nAndroid: <a href=\"https://goo.gl/b5YD8Kcontent_copy\">https://goo.gl/b5YD8K</a></p>\n<h2>Transformations ⚙️</h2>\n<p>Sometimes you want to transform, combine or filter the elements emitted by an observable sequence before the subscriber receives them. I will introduce you to the basic transformation operators, tell you something about Filters and possibilities to combine sequences. At last I will show you how to perform transformations, combinations etc. on different threads. Let’s get started.</p>\n<h3>4.1 Map</h3>\n<p>To transform Elements emitted from an observable Sequence, before they reach their subscribers, you use the <strong>map</strong> <strong>operator. Imagine a transformation that multiplies each value of a sequence with 10 before emitting.</strong><br>\n</p>\n<pre><code>Observable.of(1,2,3,4).map { value in <br>\n &nbsp;return value * 10<br>\n}.subscribe(onNext:{<br>\n &nbsp;print($0)<br>\n})</code></pre>\n<pre><code><strong>OUTPUT: 10 20 30 40</strong></code></pre>\n<h3><em><strong>4.2 FlatMap</strong></em></h3>\n<p>Imagine an Observable Sequence that consists of objects that are themselves Observables and you want to create a new Sequence from those. This is where FlatMap comes into play. FlatMap merges the emission of these resulting Observables and emitting these merged results as its own sequence.<br>\n</p>\n<pre><code>let sequence1 &nbsp;= Observable.of(1,2)<br>\nlet sequence2 &nbsp;= Observable.of(1,2)<br>\n<br>\nlet sequenceOfSequences = Observable.of(sequence1,sequence2)<br>\nsequenceOfSequences.flatMap{ return $0 }.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})</code></pre>\n<pre><code><strong>OUTPUT: 1 2 1 2**</strong></code></pre>\n<h3>4.3 Scan</h3>\n<p>Scan starts with an initial seed value and is used to aggregate values just like reduce in Swift.<br>\n</p>\n<pre><code>Observable.of(1,2,3,4,5).scan(0) { seed, value in<br>\n &nbsp;&nbsp;&nbsp;return seed + value<br>\n}.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})</code></pre>\n<pre><code>OUTPUT: 1 3 6 10 15</code></pre>\n<h3>4.4 Buffer</h3>\n<p>The Buffer operator transforms an Observable that emits items into an Observable that emits buffered collections of those items.<br>\n</p>\n<pre><code>SequenceThatEmitsWithDifferentIntervals<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.buffer(timeSpan: 150, count: 3, scheduler:s)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n</code></pre>\n<pre><code><strong>OUTPUT: [1] [2,3] [4] [5,6] [7] []</strong></code></pre>\n<h2>5.Filter 🚬</h2>\n<p>If you only want to react on next events based on certain criteria you should use a filter operator.</p>\n<h3>5.1 Filter</h3>\n<p>The Basic filter Operation works similar to the swift equivalent. You just define a condition that needs to be passed and if the condition is fulfilled a .next event will be emitted to its subscribers.<br>\n</p>\n<pre><code>Observable.of(2,30,22,5,60,1).filter{$0 &gt; 10}.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print($0)<br>\n})</code></pre>\n<pre><code><strong>OUTPUT: 30 22 60</strong></code></pre>\n<h3>5.2 DistinctUntilChanged</h3>\n<p>If you just want to emit next Events if the value changed from previous ones you need to use distinctUntilChanged.<br>\n</p>\n<pre><code>Observable.of(1,2,2,1,3).distinctUntilChanged().subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})</code></pre>\n<pre><code><strong>OUTPUT: 1 2 1 3</strong></code></pre>\n<p>Other filter operators you should try:<br>\n</p>\n<ul>\n  <li>Debounce</li>\n  <li>TakeDuration</li>\n  <li>Skip</li>\n</ul>\n<h2>Combine 💑</h2>\n<p>Combining sequences is a common Task. RxSwift provides a lot of operators for you. Here are 3 of them:</p>\n<h3>6.1 StartWith</h3>\n<p>If you want an Observable to emit a specific sequence of items before it begins emitting the items normally expected from it, use the startWith operator.<br>\n</p>\n<pre><code>Observable.of(2,3).startWith(1).subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})</code></pre>\n<pre><code><strong>OUTPUT: 1 2 3</strong></code></pre>\n<h3>6.2 Merge</h3>\n<p>You can combine the output of multiple Observables so that they act like a single Observable, by using the Merge operator.<br>\n</p>\n<pre><code>let publish1 = PublishSubject()<br>\nlet publish2 = PublishSubject()<em><strong><br>\n<br>\n</strong></em>Observable.of(publish1,publish2).merge().subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\npublish1.onNext(20)<br>\npublish1.onNext(40)<br>\npublish1.onNext(60)<br>\npublish2.onNext(1)<br>\npublish1.onNext(80)<br>\npublish2.onNext(2)<br>\npublish1.onNext(100)</code></pre>\n<pre><code><strong>OUTPUT: 20 40 60 1 80 2 100</strong></code></pre>\n<h3>6.3 Zip</h3>\n<p>You use the Zip method if you want to merge items emitted by different observable sequences to one observable sequence. Zip will operate in strict sequence, so the first two elements emitted by Zip will be the first element of the first sequence and the first element of the second sequence combined. Keep also in Mind that Zip will only emit as many items as the number of items emitted of the source Observables that emits the fewest items.<br>\n</p>\n<pre><code>let a = Observable.of(1,2,3,4,5)<br>\nlet b = Observable.of(\"a\",\"b\",\"c\",\"d\")<br>\n<br>\nObservable.zip(a,b){ return ($0,$1) }.subscribe {<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n}</code></pre>\n<pre><code><strong>OUTPUT: (1, \"a\")(2, \"b\") (3, \"c\") (4, \"d\")</strong></code></pre>\n<p>Other combination filters you should try:</p>\n<ul>\n  <li>Concat</li>\n  <li>CombineLatest</li>\n  <li>SwitchLatests</li>\n</ul>\n<h2>Side Effects 👉</h2>\n<p>If you want to register callbacks that will be executed when certain events take place on an Observable Sequence you need to use the doOn Operator. It will not modify the emitted elements but rather just pass them through. You can use …</p>\n<ul>\n  <li>do(onNext:) - if you want to do something just if a next event happened</li>\n  <li>do(onError:) - if errors will be emitted and</li>\n  <li>do(onCompleted:) - if the sequence finished successfully.</li>\n</ul>\n<pre><code>Observable.of(1,2,3,4,5).do(onNext: {<br>\n &nbsp;&nbsp;&nbsp;$0 * 10 *// This has no effect on the actual subscription<br>\n*}).subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})</code></pre>\n<h2>8.Schedulers ⏰</h2>\n<p><a href=\"https://goo.gl/b5YD8Kcontent_copy\">Operators will work on the same thread as where the subscription is created. In RxSwift you use schedulers to force operators do their work on a specific queue. You can also force that the subscription should happen on a specifc Queue. You use subscribeOnand observeOn for those tasks. If you are familiar with the concept of operation-queues or dispatch-queues this should be nothing special for you. A scheduler can be serial or concurrent similar to GCD or OperationQueue. There are 5 Types of Schedulers in RxSwift:</a><br>\n</p>\n<ul>\n  <li><strong>MainScheduler</strong> — “Abstracts work that needs to be performed on MainThread. In case schedule methods are called from the main thread, it will perform the action immediately without scheduling.This scheduler is usually used to perform UI work.”</li>\n  <li><strong>CurrentThreadScheduler</strong> — “Schedules units of work on the current thread. This is the default scheduler for operators that generate elements.”</li>\n  <li><strong>SerialDispatchQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific dispatchqueuet. It will make sure that even if a concurrent dispatch queue is passed, it's transformed into a serial one.Serial schedulers enable certain optimizations for observeOn.The main scheduler is an instance of SerialDispatchQueueScheduler\"</li>\n  <li><strong>ConcurrentDispatchQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific dispatchqueuet. You can also pass a serial dispatch queue, it shouldn't cause any problems. This scheduler is suitable when some work needs to be performed in the background.”</li>\n  <li><strong>OperationQueueScheduler</strong> — “Abstracts the work that needs to be performed on a specific NSOperationQueue. This scheduler is suitable for cases when there is some bigger chunk of work that needs to be performed in the background and you want to fine tune concurrent processing using maxConcurrentOperationCount.”</li>\n</ul>\n<p>Here is a code snippet that shows you how to observe something concurrently on a background queue und subscribe on the main-queue.</p>\n<pre><code>let publish1 = PublishSubject()<br>\nlet publish2 = PublishSubject()<br>\n<br>\nlet concurrentScheduler = ConcurrentDispatchQueueScheduler(qos: .background)<br>\nObservable.of(publish1,publish2)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.observeOn(concurrentScheduler)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.merge()<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribeOn(MainScheduler())<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\npublish1.onNext(20)<br>\npublish1.onNext(40)</code></pre>\n<pre><code><strong>OUTPUT: 20 40&nbsp;</strong></code></pre>\n<h2>It’s a wrap 🎁</h2>\n<p>Congratulation, you learned the basics of RxSwift. Happy Coding 🎉<br>\nLearn &amp; Master RxCocoa will be coming soon …<br>\nFeel free to add me on <a href=\"https://github.com/SebastianBoldt\">github</a>, <a href=\"https://twitter.com/sebastianboldt\">twitter</a>, <a href=\"https://de.linkedin.com/in/sebastian-boldt-9b465261\">linkedin</a> or <a href=\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\">xing</a> if you have any questions. If you like electronic music you can also listen to my Tracks on <a href=\"https://soundcloud.com/sebastian_boldt\">SoundCloud</a> ;) <a href=\"https://github.com/SebastianBoldt\">SebastianBoldt (Sebastian Boldt) · GitHub SebastianBoldt has 14 repositories available. Follow their code on GitHub.github.com</a><br>\n<br>\nSOURCES:</p>\n<ul>\n  <li><a href=\"https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md\">https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md</a></li>\n  <li><a href=\"http://reactivex.io/documentation/operators.html\">http://reactivex.io/documentation/operators.html</a></li>\n  <li><a href=\"http://rxmarbles.com/\">http://rxmarbles.com</a></li>\n</ul>\n</html>",
      "json_metadata": "{\"tags\":[\"programming\",\"rxswift\",\"ios\",\"swift\"],\"links\":[\"https://developer.apple.com/reference/swift/sequence\",\"https://github.com/SebastianBoldt/Learn-and-Master-RxSwift\",\"http://rxmarbles.com/\",\"https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8\",\"https://goo.gl/b5YD8Kcontent_copy\",\"https://github.com/SebastianBoldt\",\"https://twitter.com/sebastianboldt\",\"https://de.linkedin.com/in/sebastian-boldt-9b465261\",\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\",\"https://soundcloud.com/sebastian_boldt\",\"https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md\",\"http://reactivex.io/documentation/operators.html\"],\"app\":\"steemit/0.1\",\"format\":\"html\"}"
    }
  ]
}
2017/11/10 17:50:30
parent authorsebastianboldt
parent permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
authorsaluton
permlinkah9ggpi5h0kcf4xsy5fnfg
title
bodyHello!
json metadata{"tags": [""]}
Transaction InfoBlock #17105957/Trx 10478b4578be8a598e0597930d8505b527f7b631
View Raw JSON Data
{
  "trx_id": "10478b4578be8a598e0597930d8505b527f7b631",
  "block": 17105957,
  "trx_in_block": 9,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T17:50:30",
  "op": [
    "comment",
    {
      "parent_author": "sebastianboldt",
      "parent_permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "author": "saluton",
      "permlink": "ah9ggpi5h0kcf4xsy5fnfg",
      "title": "",
      "body": "Hello!",
      "json_metadata": "{\"tags\": [\"\"]}"
    }
  ]
}
2017/11/10 17:50:09
votersaluton
authorsebastianboldt
permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
weight8400 (84.00%)
Transaction InfoBlock #17105950/Trx 72e3f2347b12c2219de8ffe58aae42b3bdf9770e
View Raw JSON Data
{
  "trx_id": "72e3f2347b12c2219de8ffe58aae42b3bdf9770e",
  "block": 17105950,
  "trx_in_block": 19,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T17:50:09",
  "op": [
    "vote",
    {
      "voter": "saluton",
      "author": "sebastianboldt",
      "permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "weight": 8400
    }
  ]
}
2017/11/10 17:43:36
parent authorsebastianboldt
parent permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
authorbeerbot
permlinkre-learn-and-master-the-basics-of-rxswift-in-10-minutes-20171110t174337
title
body **Hello & Cheers!!** I'm a content detection and information bot. You are receiving this reply because a short link or links have been detected in your post/comment. The purpose of this message is to inform your readers and yourself about the use of and dangers of short links. **To the readers of the post:** Short links are provided by [url shortening](https://en.wikipedia.org/wiki/URL_shortening) services. The short links they provide can be useful in some cases. Generally their use is benign. But as with all useful tools there are dangers. Short links can be used to hide all sorts of things. Quite frequently they are used to hide referral links for instance. While not dangerous this can be deceptive. They can also be used to hide dangerous links such as links to phishing sites, sites loaded with malware, scam sites, etc. You should always be extremely cautious before clicking on one. If you don't know and trust the poster don't click. Even if you do you should still be cautious and wary of any site you are sent to. It's always better to visit the site directly and not through a short link. **To the author of the post:** While short links may be useful on some sites they are not needed on steemit. You can use markdown to format your links such as this link to [steemit](https://steemit.com). It's as simple as `[steemit](https://steemit.com)` Unlike short links this allows the reader to see where they are going by simply hovering over the link before they click on it. | | | | ---- | ---- | | <sup><sub>This message was created by a bot. It is part of the ongoing fight against spam and phishing attacks on steemit. If you did not use short links in your post and feel you have received this message in error you can contact @fubar-bdhr on discord or @fubar.bdhr on steemit chat to report the issue.</sub></sup> |![](https://steemitimages.com/DQmPaR3USbBnbvB4j69Ffh2wPJYnJSoF6BSTgdJ71QVRoJP/image.png) |
json metadata{"app": "pysteem/0.5.6"}
Transaction InfoBlock #17105819/Trx 5053d61c37908e9d2364256ca35923d5458c9f28
View Raw JSON Data
{
  "trx_id": "5053d61c37908e9d2364256ca35923d5458c9f28",
  "block": 17105819,
  "trx_in_block": 20,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T17:43:36",
  "op": [
    "comment",
    {
      "parent_author": "sebastianboldt",
      "parent_permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "author": "beerbot",
      "permlink": "re-learn-and-master-the-basics-of-rxswift-in-10-minutes-20171110t174337",
      "title": "",
      "body": "\n\n**Hello & Cheers!!** I'm a content detection and information bot.  You are receiving this reply because a short link or links have been detected in your post/comment.  The purpose of this message is to inform your readers and yourself about the use of and dangers of short links.\n\n**To the readers of the post:**  Short links are provided by [url shortening](https://en.wikipedia.org/wiki/URL_shortening) services.  The short links they provide can be useful in some cases.  Generally their use is benign.  But as with all useful tools there are dangers.  Short links can be used to hide all sorts of things.  Quite frequently they are used to hide referral links for instance.  While not dangerous this can be deceptive.  They can also be used to hide dangerous links such as links to phishing sites, sites loaded with malware, scam sites, etc.  You should always be extremely cautious before clicking on one.  If you don't know and trust the poster don't click.  Even if you do you should still be cautious and wary of any site you are sent to. It's always better to visit the site directly and not through a short link.  \n\n**To the author of the post:**  While short links may be useful on some sites they are not needed on steemit.  You can use markdown to format your links such as this link to [steemit](https://steemit.com).  It's as simple as `[steemit](https://steemit.com)`  Unlike short links this allows the reader to see where they are going by simply hovering over the link before they click on it.  \n\n|     |   |  \n| ---- | ---- |\n| <sup><sub>This message was created by a bot.  It is part of the ongoing fight against spam and phishing attacks on steemit.  If you did not use short links in your post and feel you have received this message in error you can contact @fubar-bdhr on discord or @fubar.bdhr on steemit chat to report the issue.</sub></sup> |![](https://steemitimages.com/DQmPaR3USbBnbvB4j69Ffh2wPJYnJSoF6BSTgdJ71QVRoJP/image.png) |",
      "json_metadata": "{\"app\": \"pysteem/0.5.6\"}"
    }
  ]
}
2017/11/10 17:42:42
votersebastianboldt
authorsebastianboldt
permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
weight10000 (100.00%)
Transaction InfoBlock #17105801/Trx 9f5c1624c5585de60876d13d4bba1f859ac6daac
View Raw JSON Data
{
  "trx_id": "9f5c1624c5585de60876d13d4bba1f859ac6daac",
  "block": 17105801,
  "trx_in_block": 15,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T17:42:42",
  "op": [
    "vote",
    {
      "voter": "sebastianboldt",
      "author": "sebastianboldt",
      "permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "weight": 10000
    }
  ]
}
2017/11/10 17:42:42
parent author
parent permlinkprogramming
authorsebastianboldt
permlinklearn-and-master-the-basics-of-rxswift-in-10-minutes
titleLearn & Master ⚔️ the Basics of RxSwift in 10 Minutes
body<html> <p><strong>export</strong></p> <ul> <li><strong>copy to clipboard</strong></li> <li><strong>history</strong></li> </ul> <h2>Learn &amp; Master ⚔️ the Basics of RxSwift in 10 Minutes</h2> <p>Every programmer should have heard of <em>Rx</em>. Whether it happened at the last developer conference or while reading a fresh blog article like this one 😎. It is almost impossible not to have heard of it, but what exactly is Reactive Programming? Let’s take a look on the Internet:</p> <blockquote>In computing, <strong>reactive programming</strong> is a programming paradigm oriented around data flows and the propagation of change. This means that it should be possible to express static or dynamic data flows with ease in the programming languages used, and that the underlying execution model will automatically propagate changes through the data flow. — Wikipedia</blockquote> <p>I am honest, after reading this paragraph, most people will have no idea what reactive programming actually is, so do I. This is the reason why I will try to create a simple, easy to understand Introduction for this modern approach to software development using the Swift Version of Rx: <strong>RxSwift</strong>.<br> </p> <h2><strong>1. Observable Sequences 🎞</strong></h2> <p>The first thing you need to understand is that everything in <em><strong>RxSwift</strong></em> <em><strong>is an</strong></em> <em><strong>observable sequence</strong></em> <em><strong>or something that operates on or subscribes to events emitted by an</strong></em> <em><strong>observable sequence.</strong></em><br> <em><strong>Arrays,</strong></em> <em><strong>Strings or Dictionaries</strong></em> <em><strong>will be converted to</strong></em> <em><strong>observable sequences</strong></em> <em><strong>in</strong></em> <em><strong>RxSwift. You can create an</strong></em> <em><strong>observable sequence</strong></em> <em><strong>of any Object that conforms to the</strong></em> <a href="https://developer.apple.com/reference/swift/sequence"><em><strong>Sequence</strong></em> <em><strong>Protocol</strong></em></a> <strong>from the Swift Standard Library.</strong><br> <strong>Let’s create some observable sequences:</strong></p> <pre><code><strong>let helloSequence = Observable.just("Hello Rx")<br> <br> let fibonacciSequence = Observable.from([0,1,1,2,3,5,8])<br> <br> let dictSequence = Observable.from([1:"Hello",2:"World"])</strong></code></pre> <p><strong>You subscribe to observable sequences by calling</strong> <em>subscribe(on:(Event)-&gt; ())</em><em><strong>. The passed block will receive all events emitted by that sequence.</strong></em></p> <pre><code><em><strong>let helloSequence = Observable.of("Hello Rx")<br> <br> let subscription = helloSequence.subscribe { event in<br> &nbsp;print(event)<br> }<br> <br> **OUTPUT: <br> next("Hello Rx") <br> completed**</strong></em></code></pre> <p><em><strong>Observable sequences can emit</strong></em> <em><strong>zero</strong></em> <em><strong>or more events</strong></em> <em><strong>over their lifetimes. In</strong></em> <em><strong>RxSwift</strong></em> <em><strong>an</strong></em> <em><strong>Event</strong></em> <em><strong>is just an</strong></em> <em><strong>Enumeration Type</strong></em> <em><strong>with 3 possible states:</strong></em><br> </p> <ul> <li><em><strong>.next(value: T) — When a value or collection of values is added to an observable sequence it will send the</strong></em> <em><strong>next event</strong></em> <em><strong>to its subscribers as seen above. The associated value will contain the actual value from the sequence.</strong></em></li> <li><em><strong>.error(error: Error) — If an Error is encountered, a sequence will emit an</strong></em> <em><strong>error event. This will also terminate the sequence.</strong></em></li> <li><em><strong>.completed</strong></em> <em><strong>— If a sequence ends normally it sends a</strong></em> <em><strong>completed</strong></em> <em><strong>event</strong></em> <em><strong>to its subscribers</strong></em></li> </ul> <pre><code><em><strong>let helloSequence = Observable.from(["H","e","l","l","o"])<br> <br> let subscription = helloSequence.subscribe { event in<br> &nbsp;switch event {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .next(let value):<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(value)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .error(let error):<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(error)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .completed:<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("completed")<br> &nbsp;}<br> }<br> <br> **OUTPUT:<br> H e l l o <br> completed**</strong></em></code></pre> <p><em><strong>If you want to cancel a subscription you can do that by calling</strong></em> <em><strong>dispose</strong></em> <em><strong>on it. You can also add the subscription to a</strong></em> <em><strong>Disposebagwhich will cancel the subscription for you automatically on</strong></em> <em><strong>deinit</strong></em> <em><strong>of the</strong></em> <em><strong>DisposeBag</strong></em> <em><strong>Instance. Another thing you can do is to subscribe just to a specific Event. For Example, if just want to receive the error events emitted by a sequence, you can use:</strong></em> <em><strong>subscribe(onError:(Error-&gt;())).</strong></em><br> <em><strong>This Code snippet will aggregate all the things you learned by now:</strong></em></p> <pre><code><em><strong>// Creating a DisposeBag so subscribtion will be cancelled correctly<br> let bag = DisposeBag()<br> <br> // Creating an Observable Sequence that emits a String value<br> let observable = Observable.just("Hello Rx!")<br> <br> // Creating a subscription just for next events<br> let subscription = observable.subscribe (onNext:{ <br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> // Adding the Subscription to a Dispose Bag<br> subscription.addDisposableTo(bag)</strong></em></code></pre> <h2><em><strong>Subjects 📫</strong></em></h2> <p><em><strong>A Subject is a special form of an Observable Sequence, you can subscribe and dynamically add elements to it. There are currently 4 different kinds of</strong></em> <em><strong>Subjects</strong></em> <em><strong>in</strong></em> <em><strong>RxSwift</strong></em><br> </p> <ul> <li><em><strong>PublishSubject:</strong></em> <em><strong>If you subscribe to it you will get all the events that will happen after you subscribed.</strong></em></li> <li><em><strong>BehaviourSubject:</strong></em> <em><strong>A behavior subject will give any subscriber the most recent element and everything that is emitted by that sequence after the subscription happened.</strong></em></li> <li><em><strong>ReplaySubject:</strong></em> <em><strong>If</strong></em> <em><strong>you want to replay more than the most recent element to new subscribers on the initial subscription you need to use a</strong></em> <em><strong>ReplaySubject. With a</strong></em> <em><strong>ReplaySubject, you can define how many recent items you want to emit to new subscribers.</strong></em></li> <li><em><strong>Variable:</strong></em> <em><strong>A Variable is just a</strong></em> <em><strong>BehaviourSubject</strong></em> <em><strong>wrapper that feels more natural to a none reactive programmers. It can be used like a normal Variable.</strong></em></li> </ul> <p><em><strong>I’ll just show you how the</strong></em> <em><strong>PublishSubject</strong></em> <em><strong>works in this Article. If you want to know more about the other subject types, you need to take a look at the accompanying material on</strong></em> <a href="https://github.com/SebastianBoldt/Learn-and-Master-RxSwift"><em><strong>GitHub</strong></em></a><em><strong>. They basically differ only in the number of past events emitted and received by their subscribers on initial subscription.</strong></em></p> <blockquote><em><strong>Publish: 0</strong></em><br> <em><strong>Behaviour &amp; Variable: 1</strong></em><br> <em><strong>Replay: N</strong></em></blockquote> <p><em><strong>Let’s take a look at the</strong></em> <em><strong>PublishSubject.</strong></em><br> <em><strong>The first thing we need to do is to create an actual</strong></em> <em><strong>PublishSubject</strong></em> <em><strong>instance. This is super easy, we can use the default initializer for that.</strong></em></p> <pre><code><em><strong>let bag = DisposeBag()<br> var publishSubject = PublishSubject()</strong></em></code></pre> <p><em><strong>You can add new Values to that sequence by using the</strong></em> <em><strong>onNext()</strong></em> <em><strong>function.</strong></em> <em><strong>onCompleted()</strong></em> <em><strong>will complete the sequence and</strong></em> <em><strong>onError(error)</strong></em> <em><strong>will result in emitting an error event. Let’s add some values to our</strong></em> <em><strong>PublishSubject.</strong></em></p> <pre><code><em><strong>publishSubject.onNext("Hello")<br> publishSubject.onNext("World")</strong></em></code></pre> <p><em><strong>If you subscribe to that subject after adding “Hello” and “World” using</strong></em> <em><strong>onNext(), you won’t receive these two values through events. In contrast to a</strong></em> <em><strong>BehaviourSubject, that will</strong></em> <em><strong>receive “World”, which is the most recent event.</strong></em><br> <em><strong>Now let’s create a subscription and add some new values to the Subject. We also create a second subscription and add even more values to it. Please read the comments to understand what actually is going on.</strong></em></p> <pre><code><em><strong>let subscription1 = publishSubject.subscribe(onNext:{<br> &nbsp;print($0)<br> }).addDisposableTo(bag)<br> <br> // Subscription1 receives these 2 events, Subscription2 won't<br> publishSubject.onNext("Hello")<br> publishSubject.onNext("Again")<br> <br> // Sub2 will not get "Hello" and "Again" because it susbcribed later<br> let subscription2 = publishSubject.subscribe(onNext:{<br> &nbsp;print(#line,$0)<br> })<br> <br> publishSubject.onNext("Both Subscriptions receive this message")</strong></em></code></pre> <p><em><strong>Congratulations 🎉. If you kept up reading to this point you should know the basics of</strong></em> <em><strong>RxSwift. There is a lot more to learn, but everything around</strong></em> <em><strong>Rx</strong></em> <em><strong>is based on these simple principles. You can take a short break now and play around with these concepts to fully understand them. If you are ready let us continue because there is a lot more interesting stuff to uncover.</strong></em></p> <h2><em><strong>Marble Diagrams 🙌🏼</strong></em></h2> <p><em><strong>If you work with</strong></em> <em><strong>RxSwift</strong></em> <em><strong>or</strong></em> <em><strong>Rx</strong></em> <em><strong>in general, you should get to know</strong></em> <em><strong>Marble Diagrams. A</strong></em> <em><strong>Marble Diagram</strong></em> <em><strong>visualizes the transformation of an observable sequence. It consists of the input stream on top, the output stream at the bottom and the actual transformation function in the middle.</strong></em><br> <em><strong>For Instance, let’s take look at an operation that delays your emitted events from an observable sequence by 150 milliseconds. Please ignore the scheduler parameter because I will introduce it later in the article:</strong></em><br> <br> <em><strong>Easy to understand, right?</strong></em><br> <em><strong>There are great open source projects for both</strong></em> <em><strong>iOS</strong></em> <em><strong>and</strong></em> <em><strong>Android</strong></em> <em><strong>which allows you to interactively play around with these diagrams on your mobile devices. Play around with them and I promise you that you will learn a lot about</strong></em> <em><strong>Rx</strong></em> <em><strong>in a short amount of time.</strong></em><br> <em><strong>Web-App:</strong></em> <a href="http://rxmarbles.com/"><em><strong>http://rxmarbles.com</strong></em></a> <strong>iOS-App:</strong> <a href="https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8">https://itunes.apple.com/com/app/rxmarbles/id1087272442</a> <strong>Android:</strong> <a href="https://goo.gl/b5YD8Kcontent_copy">https://goo.gl/b5YD8K</a></p> <h2>Transformations ⚙️</h2> <p>Sometimes you want to transform, combine or filter the elements emitted by an observable sequence before the subscriber receives them. I will introduce you to the basic transformation operators, tell you something about Filters and possibilities to combine sequences. At last I will show you how to perform transformations, combinations etc. on different threads. Let’s get started.</p> <h3>4.1 Map</h3> <p>To transform Elements emitted from an observable Sequence, before they reach their subscribers, you use the <em><strong>map</strong></em> <em><strong>operator. Imagine a transformation that multiplies each value of a sequence with 10 before emitting.</strong></em><br> </p> <pre><code><em><strong>Observable.of(1,2,3,4).map { value in <br> &nbsp;return value * 10<br> }.subscribe(onNext:{<br> &nbsp;print($0)<br> })<br> <br> **OUTPUT: 10 20 30 40**</strong></em></code></pre> <h3><em><strong>4.2 FlatMap</strong></em></h3> <p><em><strong>Imagine an Observable Sequence that consists of objects that are themselves Observables and you want to create a new Sequence from those. This is where</strong></em> <em><strong>FlatMap</strong></em> <em><strong>comes into play.</strong></em> <em><strong>FlatMap</strong></em> <em><strong>merges the emission of these resulting Observables and emitting these merged results as its own sequence.</strong></em><br> </p> <pre><code><em><strong>let sequence1 &nbsp;= Observable.of(1,2)<br> let sequence2 &nbsp;= Observable.of(1,2)<br> <br> let sequenceOfSequences = Observable.of(sequence1,sequence2)<br> <br> sequenceOfSequences.flatMap{ return $0 }.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> **OUTPUT: 1 2 1 2**</strong></em></code></pre> <h3><em><strong>4.3 Scan</strong></em></h3> <p><em><strong>Scan starts with an initial seed value and is used to aggregate values just like reduce in Swift.</strong></em><br> </p> <pre><code><em><strong>Observable.of(1,2,3,4,5).scan(0) { seed, value in<br> &nbsp;&nbsp;&nbsp;return seed + value<br> }.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> **OUTPUT: 1 3 6 10 15**</strong></em></code></pre> <h3><em><strong>4.4 Buffer</strong></em></h3> <p><em><strong>The Buffer operator transforms an Observable that emits items into an Observable that emits buffered collections of those items.</strong></em><br> </p> <pre><code><em><strong>SequenceThatEmitsWithDifferentIntervals<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.buffer(timeSpan: 150, count: 3, scheduler:s)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> **OUTPUT: [1] [2,3] [4] [5,6] [7] []**&nbsp;</strong></em></code></pre> <h2><em><strong>5.Filter 🚬</strong></em></h2> <p><em><strong>If you only want to react on next events based on certain criteria you should use a filter operator.</strong></em></p> <h3><em><strong>5.1 Filter</strong></em></h3> <p><em><strong>The Basic filter Operation works similar to the swift equivalent. You just define a condition that needs to be passed and if the condition is fulfilled a .next event</strong></em> <em><strong>will be emitted to its subscribers.</strong></em><br> </p> <pre><code><em><strong>Observable.of(2,30,22,5,60,1).filter{$0 &gt; 10}.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> **OUTPUT: 30 22 60**</strong></em></code></pre> <h3><em><strong>5.2 DistinctUntilChanged</strong></em></h3> <p><em><strong>If you just want to emit next Events if the value changed from previous ones you need to use distinctUntilChanged.</strong></em><br> </p> <pre><code><em><strong>Observable.of(1,2,2,1,3).distinctUntilChanged().subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> **OUTPUT: 1 2 1 3**</strong></em></code></pre> <p><em><strong>Other filter operators you should try:</strong></em><br> </p> <ul> <li><em><strong>Debounce</strong></em></li> <li><em><strong>TakeDuration</strong></em></li> <li><em><strong>Skip</strong></em></li> </ul> <h2><em><strong>Combine 💑</strong></em></h2> <p><em><strong>Combining sequences is a common Task.</strong></em> <em><strong>RxSwift</strong></em> <em><strong>provides a lot of operators for you. Here are 3 of them:</strong></em></p> <h3><em><strong>6.1 StartWith</strong></em></h3> <p><em><strong>If you want an Observable to emit a specific sequence of items before it begins emitting the items normally expected from it, use the startWith</strong></em> <em><strong>operator.</strong></em><br> </p> <pre><code><em><strong>Observable.of(2,3).startWith(1).subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> **OUTPUT: 1 2 3**</strong></em></code></pre> <h3><em><strong>6.2 Merge</strong></em></h3> <p><em><strong>You can combine the output of multiple Observables so that they act like a single Observable, by using the</strong></em> <em><strong>Merge</strong></em> <em><strong>operator.</strong></em><br> </p> <pre><code><em><strong>let publish1 = PublishSubject()<br> let publish2 = PublishSubject()<br> <br> Observable.of(publish1,publish2).merge().subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> publish1.onNext(20)<br> publish1.onNext(40)<br> publish1.onNext(60)<br> publish2.onNext(1)<br> publish1.onNext(80)<br> publish2.onNext(2)<br> publish1.onNext(100)<br> <br> **OUTPUT: 20 40 60 1 80 2 100**</strong></em></code></pre> <h3><em><strong>6.3 Zip</strong></em></h3> <p><em><strong>You use the</strong></em> <em><strong>Zip</strong></em> <em><strong>method if you want to merge items emitted by different observable sequences to one observable sequence.</strong></em> <em><strong>Zip</strong></em> <em><strong>will operate in strict sequence, so the first two elements emitted by</strong></em> <em><strong>Zip</strong></em> <em><strong>will be the first element of the first sequence and the first element of the second sequence combined. Keep also in Mind that</strong></em> <em><strong>Zip</strong></em> <em><strong>will only emit as many items as the number of items emitted of the source Observables that emits the fewest items.</strong></em><br> </p> <pre><code><em><strong>let a = Observable.of(1,2,3,4,5)<br> let b = Observable.of("a","b","c","d")<br> <br> Observable.zip(a,b){ return ($0,$1) }.subscribe {<br> &nbsp;&nbsp;&nbsp;print($0)<br> }<br> <br> **OUTPUT: (1, "a")(2, "b") (3, "c") (4, "d")**</strong></em></code></pre> <p><em><strong>Other combination filters you should try:</strong></em><br> </p> <ul> <li><em><strong>Concat</strong></em></li> <li><em><strong>CombineLatest</strong></em></li> <li><em><strong>SwitchLatests</strong></em></li> </ul> <h2><em><strong>Side Effects 👉</strong></em></h2> <p><em><strong>If you want to register callbacks that will be executed when certain events take place on an Observable Sequence you need to use the</strong></em> <em><strong>doOn</strong></em> <em><strong>Operator. It will not modify the emitted elements but rather just pass them through. You can use …</strong></em><br> </p> <ul> <li><em><strong>do(onNext:) -</strong></em> <em><strong>if you want to do something just if a</strong></em> <em><strong>next</strong></em> <em><strong>event happened</strong></em></li> <li><em><strong>do(onError:) -</strong></em> <em><strong>if errors will be emitted and</strong></em></li> <li><em><strong>do(onCompleted:) -</strong></em> <em><strong>if the sequence finished successfully.</strong></em></li> </ul> <pre><code><em><strong>Observable.of(1,2,3,4,5).do(onNext: {<br> &nbsp;&nbsp;&nbsp;$0 * 10 *// This has no effect on the actual subscription<br> *}).subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })</strong></em></code></pre> <h2><em><strong>8.Schedulers ⏰</strong></em></h2> <p><a href="https://goo.gl/b5YD8Kcontent_copy"><em><strong>Operators will work on the same thread as where the subscription is created. In RxSwift you use schedulers to force operators do their work on a specific queue. You can also force that the subscription should happen on a specifc Queue. You use</strong></em> <em><strong>subscribeOnand</strong></em> <em><strong>observeOn</strong></em> <em><strong>for those tasks. If you are familiar with the concept of operation-queues or dispatch-queues this should be nothing special for you. A scheduler can be serial or concurrent similar to GCD or OperationQueue. There are 5 Types of Schedulers in RxSwift:</strong></em></a><br> </p> <ul> <li><strong>MainScheduler</strong> — <em>“Abstracts work that needs to be performed on MainThread. In case schedule methods are called from the main thread, it will perform the action immediately without scheduling.This scheduler is usually used to perform UI work.”</em></li> <li><strong>CurrentThreadScheduler</strong> — <em>“Schedules units of work on the current thread. This is the default scheduler for operators that generate elements.”</em></li> <li><em><strong>SerialDispatchQueueScheduler</strong></em> <em><strong>— “Abstracts the work that needs to be performed on a specific dispatchqueuet. It will make sure that even if a concurrent dispatch queue is passed, it's transformed into a serial one.Serial schedulers enable certain optimizations for observeOn.The main scheduler is an instance of SerialDispatchQueueScheduler"</strong></em></li> <li><em><strong>ConcurrentDispatchQueueScheduler</strong></em> <em><strong>— “Abstracts the work that needs to be performed on a specific dispatchqueuet. You can also pass a serial dispatch queue, it shouldn't cause any problems. This scheduler is suitable when some work needs to be performed in the background.”</strong></em></li> <li><em><strong>OperationQueueScheduler</strong></em> <em><strong>— “Abstracts the work that needs to be performed on a specific NSOperationQueue. This scheduler is suitable for cases when there is some bigger chunk of work that needs to be performed in the background and you want to fine tune concurrent processing using maxConcurrentOperationCount.”</strong></em></li> </ul> <p>Here is a code snippet that shows you how to observe something concurrently on a background queue und subscribe on the main-queue.</p> <pre><code>let publish1 = PublishSubject()<br> let publish2 = PublishSubject()<br> <br> let concurrentScheduler = ConcurrentDispatchQueueScheduler(qos: .background)<br> <br> Observable.of(publish1,publish2)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.observeOn(concurrentScheduler)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.merge()<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribeOn(MainScheduler())<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(onNext:{<br> &nbsp;&nbsp;&nbsp;print($0)<br> })<br> <br> publish1.onNext(20)<br> publish1.onNext(40)<br> <br> OUTPUT: 20 40&nbsp;</code></pre> <h2>It’s a wrap 🎁</h2> <p>Congratulation, you learned the basics of RxSwift. Happy Coding 🎉<br> <em><strong>Learn &amp; Master RxCocoa</strong></em> <em><strong>will be coming soon …</strong></em><br> <em><strong>Feel free to add me on</strong></em> <a href="https://github.com/SebastianBoldt"><em><strong>github</strong></em></a><strong>,</strong> <a href="https://twitter.com/sebastianboldt">twitter</a>, <a href="https://de.linkedin.com/in/sebastian-boldt-9b465261">linkedin</a> <strong>or</strong> <a href="https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p">xing</a> <strong>if you have any questions. If you like electronic music you can also listen to my Tracks on</strong> <a href="https://soundcloud.com/sebastian_boldt">SoundCloud</a> <strong>;)</strong> <a href="https://github.com/SebastianBoldt">SebastianBoldt (Sebastian Boldt) · GitHub <em><strong>SebastianBoldt has 14 repositories available. Follow their code on GitHub.</strong></em><strong>github.com</strong></a><br> <strong>SOURCES</strong>:<br> </p> <ul> <li><a href="https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md">https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md</a></li> <li><a href="http://reactivex.io/documentation/operators.html">http://reactivex.io/documentation/operators.html</a></li> <li><a href="http://rxmarbles.com/">http://rxmarbles.com</a></li> </ul> </html>
json metadata{"tags":["programming","rxswift","ios","swift"],"links":["https://developer.apple.com/reference/swift/sequence","https://github.com/SebastianBoldt/Learn-and-Master-RxSwift","http://rxmarbles.com/","http://rxmarbles.com","https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8","https://goo.gl/b5YD8Kcontent_copy","https://github.com/SebastianBoldt","https://twitter.com/sebastianboldt","https://de.linkedin.com/in/sebastian-boldt-9b465261","https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p","https://soundcloud.com/sebastian_boldt","https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md","http://reactivex.io/documentation/operators.html"],"app":"steemit/0.1","format":"html"}
Transaction InfoBlock #17105801/Trx 9f5c1624c5585de60876d13d4bba1f859ac6daac
View Raw JSON Data
{
  "trx_id": "9f5c1624c5585de60876d13d4bba1f859ac6daac",
  "block": 17105801,
  "trx_in_block": 15,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T17:42:42",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "programming",
      "author": "sebastianboldt",
      "permlink": "learn-and-master-the-basics-of-rxswift-in-10-minutes",
      "title": "Learn & Master ⚔️ the Basics of RxSwift in 10 Minutes",
      "body": "<html>\n<p><strong>export</strong></p>\n<ul>\n  <li><strong>copy to clipboard</strong></li>\n  <li><strong>history</strong></li>\n</ul>\n<h2>Learn &amp; Master ⚔️ the Basics of RxSwift in 10 Minutes</h2>\n<p>Every programmer should have heard of <em>Rx</em>. Whether it happened at the last developer conference or while reading a fresh blog article like this one 😎. It is almost impossible not to have heard of it, but what exactly is Reactive Programming? Let’s take a look on the Internet:</p>\n<blockquote>In computing, <strong>reactive programming</strong> is a programming paradigm oriented around data flows and the propagation of change. This means that it should be possible to express static or dynamic data flows with ease in the programming languages used, and that the underlying execution model will automatically propagate changes through the data flow. — Wikipedia</blockquote>\n<p>I am honest, after reading this paragraph, most people will have no idea what reactive programming actually is, so do I. This is the reason why I will try to create a simple, easy to understand Introduction for this modern approach to software development using the Swift Version of Rx: <strong>RxSwift</strong>.<br>\n</p>\n<h2><strong>1. Observable Sequences 🎞</strong></h2>\n<p>The first thing you need to understand is that everything in <em><strong>RxSwift</strong></em> <em><strong>is an</strong></em> <em><strong>observable sequence</strong></em> <em><strong>or something that operates on or subscribes to events emitted by an</strong></em> <em><strong>observable sequence.</strong></em><br>\n<em><strong>Arrays,</strong></em> <em><strong>Strings or Dictionaries</strong></em> <em><strong>will be converted to</strong></em> <em><strong>observable sequences</strong></em> <em><strong>in</strong></em> <em><strong>RxSwift. You can create an</strong></em> <em><strong>observable sequence</strong></em> <em><strong>of any Object that conforms to the</strong></em> <a href=\"https://developer.apple.com/reference/swift/sequence\"><em><strong>Sequence</strong></em> <em><strong>Protocol</strong></em></a> <strong>from the Swift Standard Library.</strong><br>\n<strong>Let’s create some observable sequences:</strong></p>\n<pre><code><strong>let helloSequence = Observable.just(\"Hello Rx\")<br>\n<br>\nlet fibonacciSequence = Observable.from([0,1,1,2,3,5,8])<br>\n<br>\nlet dictSequence = Observable.from([1:\"Hello\",2:\"World\"])</strong></code></pre>\n<p><strong>You subscribe to observable sequences by calling</strong> <em>subscribe(on:(Event)-&gt; ())</em><em><strong>. The passed block will receive all events emitted by that sequence.</strong></em></p>\n<pre><code><em><strong>let helloSequence = Observable.of(\"Hello Rx\")<br>\n<br>\nlet subscription = helloSequence.subscribe { event in<br>\n &nbsp;print(event)<br>\n}<br>\n<br>\n**OUTPUT: <br>\nnext(\"Hello Rx\") <br>\ncompleted**</strong></em></code></pre>\n<p><em><strong>Observable sequences can emit</strong></em> <em><strong>zero</strong></em> <em><strong>or more events</strong></em> <em><strong>over their lifetimes. In</strong></em> <em><strong>RxSwift</strong></em> <em><strong>an</strong></em> <em><strong>Event</strong></em> <em><strong>is just an</strong></em> <em><strong>Enumeration Type</strong></em> <em><strong>with 3 possible states:</strong></em><br>\n</p>\n<ul>\n  <li><em><strong>.next(value: T) — When a value or collection of values is added to an observable sequence it will send the</strong></em> <em><strong>next event</strong></em> <em><strong>to its subscribers as seen above. The associated value will contain the actual value from the sequence.</strong></em></li>\n  <li><em><strong>.error(error: Error) — If an Error is encountered, a sequence will emit an</strong></em> <em><strong>error event. This will also terminate the sequence.</strong></em></li>\n  <li><em><strong>.completed</strong></em> <em><strong>— If a sequence ends normally it sends a</strong></em> <em><strong>completed</strong></em> <em><strong>event</strong></em> <em><strong>to its subscribers</strong></em></li>\n</ul>\n<pre><code><em><strong>let helloSequence = Observable.from([\"H\",\"e\",\"l\",\"l\",\"o\"])<br>\n<br>\nlet subscription = helloSequence.subscribe { event in<br>\n &nbsp;switch event {<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .next(let value):<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(value)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .error(let error):<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(error)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case .completed:<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(\"completed\")<br>\n &nbsp;}<br>\n}<br>\n<br>\n**OUTPUT:<br>\nH e l l o <br>\ncompleted**</strong></em></code></pre>\n<p><em><strong>If you want to cancel a subscription you can do that by calling</strong></em> <em><strong>dispose</strong></em> <em><strong>on it. You can also add the subscription to a</strong></em> <em><strong>Disposebagwhich will cancel the subscription for you automatically on</strong></em> <em><strong>deinit</strong></em> <em><strong>of the</strong></em> <em><strong>DisposeBag</strong></em> <em><strong>Instance. Another thing you can do is to subscribe just to a specific Event. For Example, if just want to receive the error events emitted by a sequence, you can use:</strong></em> <em><strong>subscribe(onError:(Error-&gt;())).</strong></em><br>\n<em><strong>This Code snippet will aggregate all the things you learned by now:</strong></em></p>\n<pre><code><em><strong>// Creating a DisposeBag so subscribtion will be cancelled correctly<br>\nlet bag = DisposeBag()<br>\n<br>\n// Creating an Observable Sequence that emits a String value<br>\nlet observable = Observable.just(\"Hello Rx!\")<br>\n<br>\n// Creating a subscription just for next events<br>\nlet subscription = observable.subscribe (onNext:{ <br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\n// Adding the Subscription to a Dispose Bag<br>\nsubscription.addDisposableTo(bag)</strong></em></code></pre>\n<h2><em><strong>Subjects 📫</strong></em></h2>\n<p><em><strong>A Subject is a special form of an Observable Sequence, you can subscribe and dynamically add elements to it. There are currently 4 different kinds of</strong></em> <em><strong>Subjects</strong></em> <em><strong>in</strong></em> <em><strong>RxSwift</strong></em><br>\n</p>\n<ul>\n  <li><em><strong>PublishSubject:</strong></em> <em><strong>If you subscribe to it you will get all the events that will happen after you subscribed.</strong></em></li>\n  <li><em><strong>BehaviourSubject:</strong></em> <em><strong>A behavior subject will give any subscriber the most recent element and everything that is emitted by that sequence after the subscription happened.</strong></em></li>\n  <li><em><strong>ReplaySubject:</strong></em> <em><strong>If</strong></em> <em><strong>you want to replay more than the most recent element to new subscribers on the initial subscription you need to use a</strong></em> <em><strong>ReplaySubject. With a</strong></em> <em><strong>ReplaySubject, you can define how many recent items you want to emit to new subscribers.</strong></em></li>\n  <li><em><strong>Variable:</strong></em> <em><strong>A Variable is just a</strong></em> <em><strong>BehaviourSubject</strong></em> <em><strong>wrapper that feels more natural to a none reactive programmers. It can be used like a normal Variable.</strong></em></li>\n</ul>\n<p><em><strong>I’ll just show you how the</strong></em> <em><strong>PublishSubject</strong></em> <em><strong>works in this Article. If you want to know more about the other subject types, you need to take a look at the accompanying material on</strong></em> <a href=\"https://github.com/SebastianBoldt/Learn-and-Master-RxSwift\"><em><strong>GitHub</strong></em></a><em><strong>. They basically differ only in the number of past events emitted and received by their subscribers on initial subscription.</strong></em></p>\n<blockquote><em><strong>Publish: 0</strong></em><br>\n<em><strong>Behaviour &amp; Variable: 1</strong></em><br>\n<em><strong>Replay: N</strong></em></blockquote>\n<p><em><strong>Let’s take a look at the</strong></em> <em><strong>PublishSubject.</strong></em><br>\n<em><strong>The first thing we need to do is to create an actual</strong></em> <em><strong>PublishSubject</strong></em> <em><strong>instance. This is super easy, we can use the default initializer for that.</strong></em></p>\n<pre><code><em><strong>let bag = DisposeBag()<br>\nvar publishSubject = PublishSubject()</strong></em></code></pre>\n<p><em><strong>You can add new Values to that sequence by using the</strong></em> <em><strong>onNext()</strong></em> <em><strong>function.</strong></em> <em><strong>onCompleted()</strong></em> <em><strong>will complete the sequence and</strong></em> <em><strong>onError(error)</strong></em> <em><strong>will result in emitting an error event. Let’s add some values to our</strong></em> <em><strong>PublishSubject.</strong></em></p>\n<pre><code><em><strong>publishSubject.onNext(\"Hello\")<br>\npublishSubject.onNext(\"World\")</strong></em></code></pre>\n<p><em><strong>If you subscribe to that subject after adding “Hello” and “World” using</strong></em> <em><strong>onNext(), you won’t receive these two values through events. In contrast to a</strong></em> <em><strong>BehaviourSubject, that will</strong></em> <em><strong>receive “World”, which is the most recent event.</strong></em><br>\n<em><strong>Now let’s create a subscription and add some new values to the Subject. We also create a second subscription and add even more values to it. Please read the comments to understand what actually is going on.</strong></em></p>\n<pre><code><em><strong>let subscription1 = publishSubject.subscribe(onNext:{<br>\n &nbsp;print($0)<br>\n}).addDisposableTo(bag)<br>\n<br>\n// Subscription1 receives these 2 events, Subscription2 won't<br>\npublishSubject.onNext(\"Hello\")<br>\npublishSubject.onNext(\"Again\")<br>\n<br>\n// Sub2 will not get \"Hello\" and \"Again\" because it susbcribed later<br>\nlet subscription2 = publishSubject.subscribe(onNext:{<br>\n &nbsp;print(#line,$0)<br>\n})<br>\n<br>\npublishSubject.onNext(\"Both Subscriptions receive this message\")</strong></em></code></pre>\n<p><em><strong>Congratulations 🎉. If you kept up reading to this point you should know the basics of</strong></em> <em><strong>RxSwift. There is a lot more to learn, but everything around</strong></em> <em><strong>Rx</strong></em> <em><strong>is based on these simple principles. You can take a short break now and play around with these concepts to fully understand them. If you are ready let us continue because there is a lot more interesting stuff to uncover.</strong></em></p>\n<h2><em><strong>Marble Diagrams 🙌🏼</strong></em></h2>\n<p><em><strong>If you work with</strong></em> <em><strong>RxSwift</strong></em> <em><strong>or</strong></em> <em><strong>Rx</strong></em> <em><strong>in general, you should get to know</strong></em> <em><strong>Marble Diagrams. A</strong></em> <em><strong>Marble Diagram</strong></em> <em><strong>visualizes the transformation of an observable sequence. It consists of the input stream on top, the output stream at the bottom and the actual transformation function in the middle.</strong></em><br>\n<em><strong>For Instance, let’s take look at an operation that delays your emitted events from an observable sequence by 150 milliseconds. Please ignore the scheduler parameter because I will introduce it later in the article:</strong></em><br>\n<br>\n<em><strong>Easy to understand, right?</strong></em><br>\n<em><strong>There are great open source projects for both</strong></em> <em><strong>iOS</strong></em> <em><strong>and</strong></em> <em><strong>Android</strong></em> <em><strong>which allows you to interactively play around with these diagrams on your mobile devices. Play around with them and I promise you that you will learn a lot about</strong></em> <em><strong>Rx</strong></em> <em><strong>in a short amount of time.</strong></em><br>\n<em><strong>Web-App:</strong></em> <a href=\"http://rxmarbles.com/\"><em><strong>http://rxmarbles.com</strong></em></a> <strong>iOS-App:</strong> <a href=\"https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8\">https://itunes.apple.com/com/app/rxmarbles/id1087272442</a> <strong>Android:</strong> <a href=\"https://goo.gl/b5YD8Kcontent_copy\">https://goo.gl/b5YD8K</a></p>\n<h2>Transformations ⚙️</h2>\n<p>Sometimes you want to transform, combine or filter the elements emitted by an observable sequence before the subscriber receives them. I will introduce you to the basic transformation operators, tell you something about Filters and possibilities to combine sequences. At last I will show you how to perform transformations, combinations etc. on different threads. Let’s get started.</p>\n<h3>4.1 Map</h3>\n<p>To transform Elements emitted from an observable Sequence, before they reach their subscribers, you use the <em><strong>map</strong></em> <em><strong>operator. Imagine a transformation that multiplies each value of a sequence with 10 before emitting.</strong></em><br>\n</p>\n<pre><code><em><strong>Observable.of(1,2,3,4).map { value in <br>\n &nbsp;return value * 10<br>\n}.subscribe(onNext:{<br>\n &nbsp;print($0)<br>\n})<br>\n<br>\n**OUTPUT: 10 20 30 40**</strong></em></code></pre>\n<h3><em><strong>4.2 FlatMap</strong></em></h3>\n<p><em><strong>Imagine an Observable Sequence that consists of objects that are themselves Observables and you want to create a new Sequence from those. This is where</strong></em> <em><strong>FlatMap</strong></em> <em><strong>comes into play.</strong></em> <em><strong>FlatMap</strong></em> <em><strong>merges the emission of these resulting Observables and emitting these merged results as its own sequence.</strong></em><br>\n</p>\n<pre><code><em><strong>let sequence1 &nbsp;= Observable.of(1,2)<br>\nlet sequence2 &nbsp;= Observable.of(1,2)<br>\n<br>\nlet sequenceOfSequences = Observable.of(sequence1,sequence2)<br>\n<br>\nsequenceOfSequences.flatMap{ return $0 }.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\n**OUTPUT: 1 2 1 2**</strong></em></code></pre>\n<h3><em><strong>4.3 Scan</strong></em></h3>\n<p><em><strong>Scan starts with an initial seed value and is used to aggregate values just like reduce in Swift.</strong></em><br>\n</p>\n<pre><code><em><strong>Observable.of(1,2,3,4,5).scan(0) { seed, value in<br>\n &nbsp;&nbsp;&nbsp;return seed + value<br>\n}.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\n**OUTPUT: 1 3 6 10 15**</strong></em></code></pre>\n<h3><em><strong>4.4 Buffer</strong></em></h3>\n<p><em><strong>The Buffer operator transforms an Observable that emits items into an Observable that emits buffered collections of those items.</strong></em><br>\n</p>\n<pre><code><em><strong>SequenceThatEmitsWithDifferentIntervals<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.buffer(timeSpan: 150, count: 3, scheduler:s)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\n**OUTPUT: [1] [2,3] [4] [5,6] [7] []**&nbsp;</strong></em></code></pre>\n<h2><em><strong>5.Filter 🚬</strong></em></h2>\n<p><em><strong>If you only want to react on next events based on certain criteria you should use a filter operator.</strong></em></p>\n<h3><em><strong>5.1 Filter</strong></em></h3>\n<p><em><strong>The Basic filter Operation works similar to the swift equivalent. You just define a condition that needs to be passed and if the condition is fulfilled a .next event</strong></em> <em><strong>will be emitted to its subscribers.</strong></em><br>\n</p>\n<pre><code><em><strong>Observable.of(2,30,22,5,60,1).filter{$0 &gt; 10}.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\n**OUTPUT: 30 22 60**</strong></em></code></pre>\n<h3><em><strong>5.2 DistinctUntilChanged</strong></em></h3>\n<p><em><strong>If you just want to emit next Events if the value changed from previous ones you need to use distinctUntilChanged.</strong></em><br>\n</p>\n<pre><code><em><strong>Observable.of(1,2,2,1,3).distinctUntilChanged().subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\n**OUTPUT: 1 2 1 3**</strong></em></code></pre>\n<p><em><strong>Other filter operators you should try:</strong></em><br>\n</p>\n<ul>\n  <li><em><strong>Debounce</strong></em></li>\n  <li><em><strong>TakeDuration</strong></em></li>\n  <li><em><strong>Skip</strong></em></li>\n</ul>\n<h2><em><strong>Combine 💑</strong></em></h2>\n<p><em><strong>Combining sequences is a common Task.</strong></em> <em><strong>RxSwift</strong></em> <em><strong>provides a lot of operators for you. Here are 3 of them:</strong></em></p>\n<h3><em><strong>6.1 StartWith</strong></em></h3>\n<p><em><strong>If you want an Observable to emit a specific sequence of items before it begins emitting the items normally expected from it, use the startWith</strong></em> <em><strong>operator.</strong></em><br>\n</p>\n<pre><code><em><strong>Observable.of(2,3).startWith(1).subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\n**OUTPUT: 1 2 3**</strong></em></code></pre>\n<h3><em><strong>6.2 Merge</strong></em></h3>\n<p><em><strong>You can combine the output of multiple Observables so that they act like a single Observable, by using the</strong></em> <em><strong>Merge</strong></em> <em><strong>operator.</strong></em><br>\n</p>\n<pre><code><em><strong>let publish1 = PublishSubject()<br>\nlet publish2 = PublishSubject()<br>\n<br>\nObservable.of(publish1,publish2).merge().subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\npublish1.onNext(20)<br>\npublish1.onNext(40)<br>\npublish1.onNext(60)<br>\npublish2.onNext(1)<br>\npublish1.onNext(80)<br>\npublish2.onNext(2)<br>\npublish1.onNext(100)<br>\n<br>\n**OUTPUT: 20 40 60 1 80 2 100**</strong></em></code></pre>\n<h3><em><strong>6.3 Zip</strong></em></h3>\n<p><em><strong>You use the</strong></em> <em><strong>Zip</strong></em> <em><strong>method if you want to merge items emitted by different observable sequences to one observable sequence.</strong></em> <em><strong>Zip</strong></em> <em><strong>will operate in strict sequence, so the first two elements emitted by</strong></em> <em><strong>Zip</strong></em> <em><strong>will be the first element of the first sequence and the first element of the second sequence combined. Keep also in Mind that</strong></em> <em><strong>Zip</strong></em> <em><strong>will only emit as many items as the number of items emitted of the source Observables that emits the fewest items.</strong></em><br>\n</p>\n<pre><code><em><strong>let a = Observable.of(1,2,3,4,5)<br>\nlet b = Observable.of(\"a\",\"b\",\"c\",\"d\")<br>\n<br>\nObservable.zip(a,b){ return ($0,$1) }.subscribe {<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n}<br>\n<br>\n**OUTPUT: (1, \"a\")(2, \"b\") (3, \"c\") (4, \"d\")**</strong></em></code></pre>\n<p><em><strong>Other combination filters you should try:</strong></em><br>\n</p>\n<ul>\n  <li><em><strong>Concat</strong></em></li>\n  <li><em><strong>CombineLatest</strong></em></li>\n  <li><em><strong>SwitchLatests</strong></em></li>\n</ul>\n<h2><em><strong>Side Effects 👉</strong></em></h2>\n<p><em><strong>If you want to register callbacks that will be executed when certain events take place on an Observable Sequence you need to use the</strong></em> <em><strong>doOn</strong></em> <em><strong>Operator. It will not modify the emitted elements but rather just pass them through. You can use …</strong></em><br>\n</p>\n<ul>\n  <li><em><strong>do(onNext:) -</strong></em> <em><strong>if you want to do something just if a</strong></em> <em><strong>next</strong></em> <em><strong>event happened</strong></em></li>\n  <li><em><strong>do(onError:) -</strong></em> <em><strong>if errors will be emitted and</strong></em></li>\n  <li><em><strong>do(onCompleted:) -</strong></em> <em><strong>if the sequence finished successfully.</strong></em></li>\n</ul>\n<pre><code><em><strong>Observable.of(1,2,3,4,5).do(onNext: {<br>\n &nbsp;&nbsp;&nbsp;$0 * 10 *// This has no effect on the actual subscription<br>\n*}).subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})</strong></em></code></pre>\n<h2><em><strong>8.Schedulers ⏰</strong></em></h2>\n<p><a href=\"https://goo.gl/b5YD8Kcontent_copy\"><em><strong>Operators will work on the same thread as where the subscription is created. In RxSwift you use schedulers to force operators do their work on a specific queue. You can also force that the subscription should happen on a specifc Queue. You use</strong></em> <em><strong>subscribeOnand</strong></em> <em><strong>observeOn</strong></em> <em><strong>for those tasks. If you are familiar with the concept of operation-queues or dispatch-queues this should be nothing special for you. A scheduler can be serial or concurrent similar to GCD or OperationQueue. There are 5 Types of Schedulers in RxSwift:</strong></em></a><br>\n</p>\n<ul>\n  <li><strong>MainScheduler</strong> — <em>“Abstracts work that needs to be performed on MainThread. In case schedule methods are called from the main thread, it will perform the action immediately without scheduling.This scheduler is usually used to perform UI work.”</em></li>\n  <li><strong>CurrentThreadScheduler</strong> — <em>“Schedules units of work on the current thread. This is the default scheduler for operators that generate elements.”</em></li>\n  <li><em><strong>SerialDispatchQueueScheduler</strong></em> <em><strong>— “Abstracts the work that needs to be performed on a specific dispatchqueuet. It will make sure that even if a concurrent dispatch queue is passed, it's transformed into a serial one.Serial schedulers enable certain optimizations for observeOn.The main scheduler is an instance of SerialDispatchQueueScheduler\"</strong></em></li>\n  <li><em><strong>ConcurrentDispatchQueueScheduler</strong></em> <em><strong>— “Abstracts the work that needs to be performed on a specific dispatchqueuet. You can also pass a serial dispatch queue, it shouldn't cause any problems. This scheduler is suitable when some work needs to be performed in the background.”</strong></em></li>\n  <li><em><strong>OperationQueueScheduler</strong></em> <em><strong>— “Abstracts the work that needs to be performed on a specific NSOperationQueue. This scheduler is suitable for cases when there is some bigger chunk of work that needs to be performed in the background and you want to fine tune concurrent processing using maxConcurrentOperationCount.”</strong></em></li>\n</ul>\n<p>Here is a code snippet that shows you how to observe something concurrently on a background queue und subscribe on the main-queue.</p>\n<pre><code>let publish1 = PublishSubject()<br>\nlet publish2 = PublishSubject()<br>\n<br>\nlet concurrentScheduler = ConcurrentDispatchQueueScheduler(qos: .background)<br>\n<br>\nObservable.of(publish1,publish2)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.observeOn(concurrentScheduler)<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.merge()<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribeOn(MainScheduler())<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(onNext:{<br>\n &nbsp;&nbsp;&nbsp;print($0)<br>\n})<br>\n<br>\npublish1.onNext(20)<br>\npublish1.onNext(40)<br>\n<br>\nOUTPUT: 20 40&nbsp;</code></pre>\n<h2>It’s a wrap 🎁</h2>\n<p>Congratulation, you learned the basics of RxSwift. Happy Coding 🎉<br>\n<em><strong>Learn &amp; Master RxCocoa</strong></em> <em><strong>will be coming soon …</strong></em><br>\n<em><strong>Feel free to add me on</strong></em> <a href=\"https://github.com/SebastianBoldt\"><em><strong>github</strong></em></a><strong>,</strong> <a href=\"https://twitter.com/sebastianboldt\">twitter</a>, <a href=\"https://de.linkedin.com/in/sebastian-boldt-9b465261\">linkedin</a> <strong>or</strong> <a href=\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\">xing</a> <strong>if you have any questions. If you like electronic music you can also listen to my Tracks on</strong> <a href=\"https://soundcloud.com/sebastian_boldt\">SoundCloud</a> <strong>;)</strong> <a href=\"https://github.com/SebastianBoldt\">SebastianBoldt (Sebastian Boldt) · GitHub <em><strong>SebastianBoldt has 14 repositories available. Follow their code on GitHub.</strong></em><strong>github.com</strong></a><br>\n<strong>SOURCES</strong>:<br>\n</p>\n<ul>\n  <li><a href=\"https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md\">https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md</a></li>\n  <li><a href=\"http://reactivex.io/documentation/operators.html\">http://reactivex.io/documentation/operators.html</a></li>\n  <li><a href=\"http://rxmarbles.com/\">http://rxmarbles.com</a></li>\n</ul>\n</html>",
      "json_metadata": "{\"tags\":[\"programming\",\"rxswift\",\"ios\",\"swift\"],\"links\":[\"https://developer.apple.com/reference/swift/sequence\",\"https://github.com/SebastianBoldt/Learn-and-Master-RxSwift\",\"http://rxmarbles.com/\",\"http://rxmarbles.com\",\"https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8\",\"https://goo.gl/b5YD8Kcontent_copy\",\"https://github.com/SebastianBoldt\",\"https://twitter.com/sebastianboldt\",\"https://de.linkedin.com/in/sebastian-boldt-9b465261\",\"https://www.xing.com/profile/Sebastian_Boldt8?sc_o=mxb_p\",\"https://soundcloud.com/sebastian_boldt\",\"https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Schedulers.md\",\"http://reactivex.io/documentation/operators.html\"],\"app\":\"steemit/0.1\",\"format\":\"html\"}"
    }
  ]
}
sebastianboldtupdated their account properties
2017/11/10 17:37:42
accountsebastianboldt
memo keySTM7AiKN6QHNhmcJtVNoeyDi766EEYUZKGmn1nhZeaiGVSioZkrFt
json metadata{"profile":{"profile_image":"https://i1.sndcdn.com/avatars-000341171874-uorr00-t500x500.jpg","website":"http://sebastianboldt.com"}}
Transaction InfoBlock #17105701/Trx fc5a933ad7ba2b7e3b9e05819d10d4dc980adaf2
View Raw JSON Data
{
  "trx_id": "fc5a933ad7ba2b7e3b9e05819d10d4dc980adaf2",
  "block": 17105701,
  "trx_in_block": 12,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T17:37:42",
  "op": [
    "account_update",
    {
      "account": "sebastianboldt",
      "memo_key": "STM7AiKN6QHNhmcJtVNoeyDi766EEYUZKGmn1nhZeaiGVSioZkrFt",
      "json_metadata": "{\"profile\":{\"profile_image\":\"https://i1.sndcdn.com/avatars-000341171874-uorr00-t500x500.jpg\",\"website\":\"http://sebastianboldt.com\"}}"
    }
  ]
}
sebastianboldtupdated their account properties
2017/11/10 17:36:48
accountsebastianboldt
memo keySTM7AiKN6QHNhmcJtVNoeyDi766EEYUZKGmn1nhZeaiGVSioZkrFt
json metadata{"profile":{"website":"http://sebastianboldt.com"}}
Transaction InfoBlock #17105683/Trx 938edae831f7d282555f43761c97422695f0bfe5
View Raw JSON Data
{
  "trx_id": "938edae831f7d282555f43761c97422695f0bfe5",
  "block": 17105683,
  "trx_in_block": 22,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T17:36:48",
  "op": [
    "account_update",
    {
      "account": "sebastianboldt",
      "memo_key": "STM7AiKN6QHNhmcJtVNoeyDi766EEYUZKGmn1nhZeaiGVSioZkrFt",
      "json_metadata": "{\"profile\":{\"website\":\"http://sebastianboldt.com\"}}"
    }
  ]
}
steemcreated a new account: @sebastianboldt
2017/11/10 15:26:21
fee0.500 STEEM
delegation57000.000000 VESTS
creatorsteem
new account namesebastianboldt
owner{"weight_threshold":1,"account_auths":[],"key_auths":[["STM8afWTATLFUHYxu1fDH2kQ9J1puGFoz7o2N12cELJjtZ4FrS6pg",1]]}
active{"weight_threshold":1,"account_auths":[],"key_auths":[["STM7kARdw8TFz3Wd9yxoTHxWb4iCM9fLq4o89hy5UwJJexo5MHqdx",1]]}
posting{"weight_threshold":1,"account_auths":[],"key_auths":[["STM8Y45UonpGBJSoQANxeZWhokGZ9qM7M3vcoPsVpXTpQD2Hx7cUj",1]]}
memo keySTM7AiKN6QHNhmcJtVNoeyDi766EEYUZKGmn1nhZeaiGVSioZkrFt
json metadata
extensions[]
Transaction InfoBlock #17103074/Trx 27c43fa6617d86944617d0ed83ac27fe6512229a
View Raw JSON Data
{
  "trx_id": "27c43fa6617d86944617d0ed83ac27fe6512229a",
  "block": 17103074,
  "trx_in_block": 9,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-10T15:26:21",
  "op": [
    "account_create_with_delegation",
    {
      "fee": "0.500 STEEM",
      "delegation": "57000.000000 VESTS",
      "creator": "steem",
      "new_account_name": "sebastianboldt",
      "owner": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM8afWTATLFUHYxu1fDH2kQ9J1puGFoz7o2N12cELJjtZ4FrS6pg",
            1
          ]
        ]
      },
      "active": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM7kARdw8TFz3Wd9yxoTHxWb4iCM9fLq4o89hy5UwJJexo5MHqdx",
            1
          ]
        ]
      },
      "posting": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM8Y45UonpGBJSoQANxeZWhokGZ9qM7M3vcoPsVpXTpQD2Hx7cUj",
            1
          ]
        ]
      },
      "memo_key": "STM7AiKN6QHNhmcJtVNoeyDi766EEYUZKGmn1nhZeaiGVSioZkrFt",
      "json_metadata": "",
      "extensions": []
    }
  ]
}

Account Metadata

POSTING JSON METADATA
profile{"profile_image":"https://i1.sndcdn.com/avatars-000341171874-uorr00-t500x500.jpg","website":"http://sebastianboldt.com"}
JSON METADATA
profile{"profile_image":"https://i1.sndcdn.com/avatars-000341171874-uorr00-t500x500.jpg","website":"http://sebastianboldt.com"}
{
  "posting_json_metadata": {
    "profile": {
      "profile_image": "https://i1.sndcdn.com/avatars-000341171874-uorr00-t500x500.jpg",
      "website": "http://sebastianboldt.com"
    }
  },
  "json_metadata": {
    "profile": {
      "profile_image": "https://i1.sndcdn.com/avatars-000341171874-uorr00-t500x500.jpg",
      "website": "http://sebastianboldt.com"
    }
  }
}

Auth Keys

Owner
Single Signature
Public Keys
STM8afWTATLFUHYxu1fDH2kQ9J1puGFoz7o2N12cELJjtZ4FrS6pg1/1
Active
Single Signature
Public Keys
STM7kARdw8TFz3Wd9yxoTHxWb4iCM9fLq4o89hy5UwJJexo5MHqdx1/1
Posting
Single Signature
Public Keys
STM8Y45UonpGBJSoQANxeZWhokGZ9qM7M3vcoPsVpXTpQD2Hx7cUj1/1
Memo
STM7AiKN6QHNhmcJtVNoeyDi766EEYUZKGmn1nhZeaiGVSioZkrFt
{
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8afWTATLFUHYxu1fDH2kQ9J1puGFoz7o2N12cELJjtZ4FrS6pg",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM7kARdw8TFz3Wd9yxoTHxWb4iCM9fLq4o89hy5UwJJexo5MHqdx",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8Y45UonpGBJSoQANxeZWhokGZ9qM7M3vcoPsVpXTpQD2Hx7cUj",
        1
      ]
    ]
  },
  "memo": "STM7AiKN6QHNhmcJtVNoeyDi766EEYUZKGmn1nhZeaiGVSioZkrFt"
}

Witness Votes

0 / 30
No active witness votes.
[]