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 DelegationsDeleg
+4.376SP
Detailed Balance
| STEEM | ||
| balance | 0.000STEEM | STEEM |
| market_balance | 0.000STEEM | STEEM |
| savings_balance | 0.000STEEM | STEEM |
| reward_steem_balance | 0.000STEEM | STEEM |
| STEEM POWER | ||
| Own SP | 0.632SP | SP |
| Delegated Out | 0.000SP | SP |
| Delegation In | 4.376SP | SP |
| Effective Power | 5.008SP | SP |
| Reward SP (pending) | 0.252SP | SP |
| SBD | ||
| sbd_balance | 0.000SBD | SBD |
| sbd_conversions | 0.000SBD | SBD |
| sbd_market_balance | 0.000SBD | SBD |
| savings_sbd_balance | 0.000SBD | SBD |
| reward_sbd_balance | 0.231SBD | SBD |
{
"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
| name | sebastianboldt |
| id | 437237 |
| rank | 829,691 |
| reputation | 4544554905 |
| created | 2017-11-10T15:26:21 |
| recovery_account | steem |
| proxy | None |
| post_count | 2 |
| comment_count | 0 |
| lifetime_vote_count | 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 |
| proxied_vsf_votes | 0, 0, 0, 0 |
| can_vote | 1 |
| voting_power | 0 |
| delayed_votes | 0 |
| balance | 0.000 STEEM |
| savings_balance | 0.000 STEEM |
| sbd_balance | 0.000 SBD |
| savings_sbd_balance | 0.000 SBD |
| vesting_shares | 1027.251799 VESTS |
| delegated_vesting_shares | 0.000000 VESTS |
| received_vesting_shares | 7116.408007 VESTS |
| reward_vesting_balance | 517.548458 VESTS |
| vesting_balance | 0.000 STEEM |
| vesting_withdraw_rate | 0.000000 VESTS |
| next_vesting_withdrawal | 1969-12-31T23:59:59 |
| withdrawn | 0 |
| to_withdraw | 0 |
| withdraw_routes | 0 |
| savings_withdraw_requests | 0 |
| last_account_recovery | 1970-01-01T00:00:00 |
| reset_account | null |
| last_owner_update | 1970-01-01T00:00:00 |
| last_account_update | 2017-11-10T17:37:42 |
| mined | No |
| sbd_seconds | 0 |
| sbd_last_interest_payment | 1970-01-01T00:00:00 |
| savings_sbd_last_interest_payment | 1970-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
| Incoming | Outgoing |
|---|---|
Empty | Empty |
{
"incoming": [],
"outgoing": []
}From Date
To Date
steemdelegated 4.376 SP to @sebastianboldt2026/05/18 06:16:24
steemdelegated 4.376 SP to @sebastianboldt
2026/05/18 06:16:24
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 7116.408007 VESTS |
| Transaction Info | Block #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 @sebastianboldt2026/05/13 04:20:06
steemdelegated 2.708 SP to @sebastianboldt
2026/05/13 04:20:06
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 4404.197602 VESTS |
| Transaction Info | Block #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 @sebastianboldt2026/04/26 05:28:09
steemdelegated 4.384 SP to @sebastianboldt
2026/04/26 05:28:09
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 7128.923763 VESTS |
| Transaction Info | Block #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 @sebastianboldt2026/01/24 00:01:09
steemdelegated 2.734 SP to @sebastianboldt
2026/01/24 00:01:09
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 4445.744421 VESTS |
| Transaction Info | Block #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 @sebastianboldt2024/12/17 19:10:57
steemdelegated 2.835 SP to @sebastianboldt
2024/12/17 19:10:57
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 4609.963618 VESTS |
| Transaction Info | Block #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 @sebastianboldt2023/11/14 10:52:15
steemdelegated 2.939 SP to @sebastianboldt
2023/11/14 10:52:15
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 4779.097150 VESTS |
| Transaction Info | Block #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 @sebastianboldt2023/09/22 10:23:06
steemdelegated 4.745 SP to @sebastianboldt
2023/09/22 10:23:06
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 7716.005936 VESTS |
| Transaction Info | Block #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 @sebastianboldt2022/11/03 17:50:30
steemdelegated 4.881 SP to @sebastianboldt
2022/11/03 17:50:30
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 7938.057374 VESTS |
| Transaction Info | Block #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 @sebastianboldt2022/01/17 23:02:09
steemdelegated 5.017 SP to @sebastianboldt
2022/01/17 23:02:09
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 8158.164975 VESTS |
| Transaction Info | Block #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 @sebastianboldt2021/06/14 06:13:15
steemdelegated 5.130 SP to @sebastianboldt
2021/06/14 06:13:15
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 8342.359263 VESTS |
| Transaction Info | Block #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 @sebastianboldt2020/12/11 16:25:36
steemdelegated 5.245 SP to @sebastianboldt
2020/12/11 16:25:36
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 8529.781237 VESTS |
| Transaction Info | Block #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 @sebastianboldt2020/12/06 10:01:18
steemdelegated 1.176 SP to @sebastianboldt
2020/12/06 10:01:18
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 1912.543513 VESTS |
| Transaction Info | Block #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 @sebastianboldt2020/12/05 20:03:24
steemdelegated 5.249 SP to @sebastianboldt
2020/12/05 20:03:24
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 8535.989091 VESTS |
| Transaction Info | Block #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 @sebastianboldt2020/11/03 02:37:54
steemdelegated 1.181 SP to @sebastianboldt
2020/11/03 02:37:54
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 1920.017158 VESTS |
| Transaction Info | Block #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 @sebastianboldt2020/05/09 11:04:18
steemdelegated 5.374 SP to @sebastianboldt
2020/05/09 11:04:18
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 8738.794450 VESTS |
| Transaction Info | Block #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 @sebastianboldt2020/05/08 15:28:24
steemdelegated 1.201 SP to @sebastianboldt
2020/05/08 15:28:24
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 1953.311140 VESTS |
| Transaction Info | Block #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 @sebastianboldt2020/04/16 03:16:00
steemdelegated 5.382 SP to @sebastianboldt
2020/04/16 03:16:00
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 8751.681898 VESTS |
| Transaction Info | Block #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
2019/11/10 16:32:33
| 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! <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 Info | Block #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 @sebastianboldt2019/05/12 20:23:06
steemdelegated 5.502 SP to @sebastianboldt
2019/05/12 20:23:06
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 8947.298711 VESTS |
| Transaction Info | Block #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
2018/11/10 17:02:03
| 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! [](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 Info | Block #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[](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 @sebastianboldt2018/05/17 02:41:42
steemdelegated 5.625 SP to @sebastianboldt
2018/05/17 02:41:42
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 9146.813803 VESTS |
| Transaction Info | Block #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 @sebastianboldt2018/04/21 20:52:15
steemdelegated 18.162 SP to @sebastianboldt
2018/04/21 20:52:15
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 29534.916149 VESTS |
| Transaction Info | Block #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 @sebastianboldt2017/12/12 22:22:12
steemdelegated 18.287 SP to @sebastianboldt
2017/12/12 22:22:12
| delegator | steem |
| delegatee | sebastianboldt |
| vesting shares | 29738.748201 VESTS |
| Transaction Info | Block #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"
}
]
}sebastianboldtupvoted (100.00%) @chasewest / api-resources-for-cryptocurrencies2017/11/27 19:23:00
sebastianboldtupvoted (100.00%) @chasewest / api-resources-for-cryptocurrencies
2017/11/27 19:23:00
| voter | sebastianboldt |
| author | chasewest |
| permlink | api-resources-for-cryptocurrencies |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}
]
}regisekupvoted (100.00%) @sebastianboldt / 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/19 15:14:18
regisekupvoted (100.00%) @sebastianboldt / 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/19 15:14:18
| voter | regisek |
| author | sebastianboldt |
| permlink | 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}
]
}sebastianboldtreceived 0.231 SBD, 0.313 SP author reward for @sebastianboldt / 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/17 17:55:39
sebastianboldtreceived 0.231 SBD, 0.313 SP author reward for @sebastianboldt / 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/17 17:55:39
| 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 |
| Transaction Info | Block #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"
}
]
}sebastianboldtreceived 0.005 SP curation reward for @sebastianboldt / 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/17 17:55:39
sebastianboldtreceived 0.005 SP curation reward for @sebastianboldt / 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/17 17:55:39
| curator | sebastianboldt |
| reward | 8.215054 VESTS |
| comment author | sebastianboldt |
| comment permlink | 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes |
| Transaction Info | Block #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"
}
]
}papasloppaupvoted (100.00%) @sebastianboldt / 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/11 08:37:21
papasloppaupvoted (100.00%) @sebastianboldt / 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/11 08:37:21
| voter | papasloppa |
| author | sebastianboldt |
| permlink | 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}
]
}ko4nevaalupvoted (100.00%) @sebastianboldt / learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 20:34:24
ko4nevaalupvoted (100.00%) @sebastianboldt / learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 20:34:24
| voter | ko4nevaal |
| author | sebastianboldt |
| permlink | learn-and-master-the-basics-of-rxswift-in-10-minutes |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}
]
}otkovaupvoted (100.00%) @sebastianboldt / learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 20:34:24
otkovaupvoted (100.00%) @sebastianboldt / learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 20:34:24
| voter | otkova |
| author | sebastianboldt |
| permlink | learn-and-master-the-basics-of-rxswift-in-10-minutes |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}
]
}leksovalishupvoted (100.00%) @sebastianboldt / learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 20:34:21
leksovalishupvoted (100.00%) @sebastianboldt / learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 20:34:21
| voter | leksovalish |
| author | sebastianboldt |
| permlink | learn-and-master-the-basics-of-rxswift-in-10-minutes |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}
]
}sebastianboldtupvoted (100.00%) @alcibiades / street-photography-with-a-cinematic-look-street-life-52017/11/10 19:44:33
sebastianboldtupvoted (100.00%) @alcibiades / street-photography-with-a-cinematic-look-street-life-5
2017/11/10 19:44:33
| voter | sebastianboldt |
| author | alcibiades |
| permlink | street-photography-with-a-cinematic-look-street-life-5 |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}
]
}geekgirlupvoted (100.00%) @sebastianboldt / 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 19:33:00
geekgirlupvoted (100.00%) @sebastianboldt / 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 19:33:00
| voter | geekgirl |
| author | sebastianboldt |
| permlink | 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}
]
}sebastianboldtpublished a new post: 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 18:28:39
sebastianboldtpublished a new post: 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 18:28:39
| 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 @@ 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 Info | Block #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\"]}"
}
]
}sebastianboldtpublished a new post: 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 18:28:30
sebastianboldtpublished a new post: 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 18:28:30
| 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 @@ 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 Info | Block #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
2017/11/10 18:26:06
| voter | sqube |
| author | sebastianboldt |
| permlink | 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes |
| weight | 100 (1.00%) |
| Transaction Info | Block #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
}
]
}sebastianboldtpublished a new post: 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 18:25:06
sebastianboldtpublished a new post: 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 18:25:06
| 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 @@ -%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=& +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=& +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 - %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 Info | Block #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=&\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=&\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- %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\"]}"
}
]
}ubgupvoted (1.00%) @sebastianboldt / learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 18:21:12
ubgupvoted (1.00%) @sebastianboldt / learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 18:21:12
| voter | ubg |
| author | sebastianboldt |
| permlink | learn-and-master-the-basics-of-rxswift-in-10-minutes |
| weight | 100 (1.00%) |
| Transaction Info | Block #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
}
]
}sebastianboldtpublished a new post: learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 18:21:03
sebastianboldtpublished a new post: learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 18:21:03
| 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 @@ %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 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 %3C/ @@ -3173,29 +3173,24 @@ %22,%22o%22%5D)%3Cbr%3E%0A -%3Cbr%3E%0A let subscrip @@ -3274,29 +3274,24 @@ ; %3Cbr%3E%0A -%3Cbr%3E%0A   @@ -3326,29 +3326,24 @@ value):%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -3398,36 +3398,25 @@ (value)%3Cbr%3E%0A -%3Cbr%3E%0A + @@ -3451,29 +3451,24 @@ error):%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -3523,29 +3523,24 @@ (error)%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -3575,29 +3575,24 @@ pleted:%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -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   @@ -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 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 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 %3C/ @@ -10072,29 +10072,24 @@ lue in %3Cbr%3E%0A -%3Cbr%3E%0A 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 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 &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   @@ -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 &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   @@ -11584,29 +11584,24 @@ uler:s)%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -11659,37 +11659,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &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 &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 &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 &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 &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   @@ -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   @@ -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 &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 + Oper @@ -16083,20 +16083,22 @@ RxSwift: -%3C/a%3E + %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   @@ -17990,29 +17990,24 @@ eduler)%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -18058,29 +18058,24 @@ merge()%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -18147,29 +18147,24 @@ uler())%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -18226,29 +18226,24 @@ nNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -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 Info | Block #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 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 %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 ; %3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -3326,29 +3326,24 @@\n value):%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -3398,36 +3398,25 @@\n (value)%3Cbr%3E%0A\n-%3Cbr%3E%0A \n+ \n \n@@ -3451,29 +3451,24 @@\n error):%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -3523,29 +3523,24 @@\n (error)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -3575,29 +3575,24 @@\n pleted:%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \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  \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 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 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 %3C/\n@@ -10072,29 +10072,24 @@\n lue in %3Cbr%3E%0A\n-%3Cbr%3E%0A\n 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 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 &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  \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 &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  \n@@ -11584,29 +11584,24 @@\n uler:s)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -11659,37 +11659,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n &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 &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 &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 &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 &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  \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  \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 &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+ \n Oper\n@@ -16083,20 +16083,22 @@\n RxSwift:\n-%3C/a%3E\n+ \n %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  \n@@ -17990,29 +17990,24 @@\n eduler)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -18058,29 +18058,24 @@\n merge()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -18147,29 +18147,24 @@\n uler())%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -18226,29 +18226,24 @@\n nNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \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\"]}"
}
]
}sebastianboldtpublished a new post: learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 18:21:00
sebastianboldtpublished a new post: learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 18:21:00
| 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 @@ %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 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 %3C/ @@ -3173,29 +3173,24 @@ %22,%22o%22%5D)%3Cbr%3E%0A -%3Cbr%3E%0A let subscrip @@ -3274,29 +3274,24 @@ ; %3Cbr%3E%0A -%3Cbr%3E%0A   @@ -3326,29 +3326,24 @@ value):%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -3398,36 +3398,25 @@ (value)%3Cbr%3E%0A -%3Cbr%3E%0A + @@ -3451,29 +3451,24 @@ error):%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -3523,29 +3523,24 @@ (error)%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -3575,29 +3575,24 @@ pleted:%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -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   @@ -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 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 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 %3C/ @@ -10072,29 +10072,24 @@ lue in %3Cbr%3E%0A -%3Cbr%3E%0A 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 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 &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   @@ -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 &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   @@ -11584,29 +11584,24 @@ uler:s)%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -11659,37 +11659,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &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 &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 &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 &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 &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   @@ -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   @@ -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 &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 + Oper @@ -16083,20 +16083,22 @@ RxSwift: -%3C/a%3E + %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   @@ -17990,29 +17990,24 @@ eduler)%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -18058,29 +18058,24 @@ merge()%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -18147,29 +18147,24 @@ uler())%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -18226,29 +18226,24 @@ nNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -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 Info | Block #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 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 %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 ; %3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -3326,29 +3326,24 @@\n value):%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -3398,36 +3398,25 @@\n (value)%3Cbr%3E%0A\n-%3Cbr%3E%0A \n+ \n \n@@ -3451,29 +3451,24 @@\n error):%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -3523,29 +3523,24 @@\n (error)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -3575,29 +3575,24 @@\n pleted:%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \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  \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 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 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 %3C/\n@@ -10072,29 +10072,24 @@\n lue in %3Cbr%3E%0A\n-%3Cbr%3E%0A\n 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 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 &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  \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 &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  \n@@ -11584,29 +11584,24 @@\n uler:s)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -11659,37 +11659,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n &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 &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 &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 &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 &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  \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  \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 &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+ \n Oper\n@@ -16083,20 +16083,22 @@\n RxSwift:\n-%3C/a%3E\n+ \n %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  \n@@ -17990,29 +17990,24 @@\n eduler)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -18058,29 +18058,24 @@\n merge()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -18147,29 +18147,24 @@\n uler())%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -18226,29 +18226,24 @@\n nNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \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\"]}"
}
]
}sebastianboldtpublished a new post: learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 18:20:03
sebastianboldtpublished a new post: learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 18:20:03
| 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 @@ %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 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 %3C/ @@ -3142,29 +3142,24 @@ %22,%22o%22%5D)%3Cbr%3E%0A -%3Cbr%3E%0A let subscrip @@ -3243,29 +3243,24 @@ ; %3Cbr%3E%0A -%3Cbr%3E%0A   @@ -3295,29 +3295,24 @@ value):%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -3367,36 +3367,25 @@ (value)%3Cbr%3E%0A -%3Cbr%3E%0A + @@ -3420,29 +3420,24 @@ error):%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -3492,29 +3492,24 @@ (error)%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -3544,29 +3544,24 @@ pleted:%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -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   @@ -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 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 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 %3C/ @@ -10041,29 +10041,24 @@ lue in %3Cbr%3E%0A -%3Cbr%3E%0A 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 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 &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   @@ -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 &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   @@ -11553,29 +11553,24 @@ uler:s)%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -11628,37 +11628,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &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 &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 &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 &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 &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   @@ -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   @@ -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 &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 + Oper @@ -16052,20 +16052,22 @@ RxSwift: -%3C/a%3E + %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   @@ -17959,29 +17959,24 @@ eduler)%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -18027,29 +18027,24 @@ merge()%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -18116,29 +18116,24 @@ uler())%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -18195,29 +18195,24 @@ nNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -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 Info | Block #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 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 %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 ; %3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -3295,29 +3295,24 @@\n value):%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -3367,36 +3367,25 @@\n (value)%3Cbr%3E%0A\n-%3Cbr%3E%0A \n+ \n \n@@ -3420,29 +3420,24 @@\n error):%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -3492,29 +3492,24 @@\n (error)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -3544,29 +3544,24 @@\n pleted:%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \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  \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 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 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 %3C/\n@@ -10041,29 +10041,24 @@\n lue in %3Cbr%3E%0A\n-%3Cbr%3E%0A\n 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 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 &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  \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 &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  \n@@ -11553,29 +11553,24 @@\n uler:s)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -11628,37 +11628,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n &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 &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 &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 &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 &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  \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  \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 &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+ \n Oper\n@@ -16052,20 +16052,22 @@\n RxSwift:\n-%3C/a%3E\n+ \n %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  \n@@ -17959,29 +17959,24 @@\n eduler)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -18027,29 +18027,24 @@\n merge()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -18116,29 +18116,24 @@\n uler())%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -18195,29 +18195,24 @@\n nNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \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\"]}"
}
]
}squbeupvoted (1.00%) @sebastianboldt / learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 18:16:30
squbeupvoted (1.00%) @sebastianboldt / learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 18:16:30
| voter | sqube |
| author | sebastianboldt |
| permlink | learn-and-master-the-basics-of-rxswift-in-10-minutes |
| weight | 100 (1.00%) |
| Transaction Info | Block #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
}
]
}sebastianboldtpublished a new post: learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 18:15:36
sebastianboldtpublished a new post: learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 18:15:36
| 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 @@ %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 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 %3C/ @@ -3142,29 +3142,24 @@ %22,%22o%22%5D)%3Cbr%3E%0A -%3Cbr%3E%0A let subscrip @@ -3243,29 +3243,24 @@ ; %3Cbr%3E%0A -%3Cbr%3E%0A   @@ -3295,29 +3295,24 @@ value):%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -3367,36 +3367,25 @@ (value)%3Cbr%3E%0A -%3Cbr%3E%0A + @@ -3420,29 +3420,24 @@ error):%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -3492,29 +3492,24 @@ (error)%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -3544,29 +3544,24 @@ pleted:%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -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   @@ -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 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 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 %3C/ @@ -10041,29 +10041,24 @@ lue in %3Cbr%3E%0A -%3Cbr%3E%0A 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 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 &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   @@ -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 &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   @@ -11553,29 +11553,24 @@ uler:s)%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -11628,37 +11628,32 @@ be(onNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A &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 &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 &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 &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 &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   @@ -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   @@ -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 &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   @@ -17995,29 +17995,24 @@ eduler)%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -18063,29 +18063,24 @@ merge()%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -18152,29 +18152,24 @@ uler())%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -18231,29 +18231,24 @@ nNext:%7B%3Cbr%3E%0A -%3Cbr%3E%0A   @@ -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 Info | Block #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 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 %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 ; %3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -3295,29 +3295,24 @@\n value):%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -3367,36 +3367,25 @@\n (value)%3Cbr%3E%0A\n-%3Cbr%3E%0A \n+ \n \n@@ -3420,29 +3420,24 @@\n error):%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -3492,29 +3492,24 @@\n (error)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -3544,29 +3544,24 @@\n pleted:%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \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  \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 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 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 %3C/\n@@ -10041,29 +10041,24 @@\n lue in %3Cbr%3E%0A\n-%3Cbr%3E%0A\n 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 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 &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  \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 &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  \n@@ -11553,29 +11553,24 @@\n uler:s)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -11628,37 +11628,32 @@\n be(onNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n &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 &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 &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 &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 &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  \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  \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 &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  \n@@ -17995,29 +17995,24 @@\n eduler)%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -18063,29 +18063,24 @@\n merge()%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -18152,29 +18152,24 @@\n uler())%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \n@@ -18231,29 +18231,24 @@\n nNext:%7B%3Cbr%3E%0A\n-%3Cbr%3E%0A\n  \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
2017/11/10 18:08:54
| voter | sebastianboldt |
| author | sebastianboldt |
| permlink | 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}
]
}sebastianboldtpublished a new post: learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 18:05:06
sebastianboldtpublished a new post: learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 18:05:06
| 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 @@ 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 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 switc @@ -3957,24 +3957,29 @@ ; %3Cbr%3E%0A +%3Cbr%3E%0A   @@ -4014,24 +4014,29 @@ value):%3Cbr%3E%0A +%3Cbr%3E%0A   @@ -4091,24 +4091,29 @@ (value)%3Cbr%3E%0A +%3Cbr%3E%0A   @@ -4155,24 +4155,29 @@ error):%3Cbr%3E%0A +%3Cbr%3E%0A   @@ -4232,24 +4232,29 @@ (error)%3Cbr%3E%0A +%3Cbr%3E%0A   @@ -4289,24 +4289,29 @@ pleted:%3Cbr%3E%0A +%3Cbr%3E%0A   @@ -4372,24 +4372,29 @@ leted%22)%3Cbr%3E%0A +%3Cbr%3E%0A %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   @@ -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 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 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 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 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 &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   @@ -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 &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   @@ -12551,24 +12551,29 @@ uler:s)%3Cbr%3E%0A +%3Cbr%3E%0A   @@ -12631,32 +12631,37 @@ be(onNext:%7B%3Cbr%3E%0A +%3Cbr%3E%0A &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 &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 &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 &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 &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   @@ -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   @@ -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 &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   @@ -19103,24 +19103,29 @@ eduler)%3Cbr%3E%0A +%3Cbr%3E%0A   @@ -19176,24 +19176,29 @@ merge()%3Cbr%3E%0A +%3Cbr%3E%0A   @@ -19270,24 +19270,29 @@ uler())%3Cbr%3E%0A +%3Cbr%3E%0A   @@ -19354,24 +19354,29 @@ nNext:%7B%3Cbr%3E%0A +%3Cbr%3E%0A   @@ -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 Info | Block #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 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 switc\n@@ -3957,24 +3957,29 @@\n ; %3Cbr%3E%0A\n+%3Cbr%3E%0A\n  \n@@ -4014,24 +4014,29 @@\n value):%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  \n@@ -4091,24 +4091,29 @@\n (value)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  \n@@ -4155,24 +4155,29 @@\n error):%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  \n@@ -4232,24 +4232,29 @@\n (error)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  \n@@ -4289,24 +4289,29 @@\n pleted:%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  \n@@ -4372,24 +4372,29 @@\n leted%22)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n %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  \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 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 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 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 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 &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  \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 &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  \n@@ -12551,24 +12551,29 @@\n uler:s)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  \n@@ -12631,32 +12631,37 @@\n be(onNext:%7B%3Cbr%3E%0A\n+%3Cbr%3E%0A\n &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 &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 &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 &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 &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  \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  \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 &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  \n@@ -19103,24 +19103,29 @@\n eduler)%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  \n@@ -19176,24 +19176,29 @@\n merge()%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  \n@@ -19270,24 +19270,29 @@\n uler())%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  \n@@ -19354,24 +19354,29 @@\n nNext:%7B%3Cbr%3E%0A\n+%3Cbr%3E%0A\n  \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\"]}"
}
]
}sebastianboldtpublished a new post: 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 18:03:24
sebastianboldtpublished a new post: 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 18:03:24
| 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 @@ # 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&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":"html","image":["https://cdn-images-1.medium.com/max/4000/1*i3SuhBo3VEC8G79ee1CQ5w.jpeg"]} |
| Transaction Info | Block #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&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\":\"html\",\"image\":[\"https://cdn-images-1.medium.com/max/4000/1*i3SuhBo3VEC8G79ee1CQ5w.jpeg\"]}"
}
]
}sebastianboldtpublished a new post: 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 18:01:45
sebastianboldtpublished a new post: 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 18:01:45
| 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> <p><br></p> <p>## My iOS Development Toolkit 2017</p> <p>Last Update 27.02.2017</p> <p><br></p> <p></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&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) **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&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) **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 & 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 & Resources on [**iOSDev.tools](https://iosdev.tools)**</p> <p><br></p> <p>* [**Cocoa Controls](https://www.cocoacontrols.com)** provides 4200 open source UI components </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&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":"html","image":["https://cdn-images-1.medium.com/max/4000/1*i3SuhBo3VEC8G79ee1CQ5w.jpeg"]} |
| Transaction Info | Block #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></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&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) **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&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) **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 & 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 & 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 </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&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\":\"html\",\"image\":[\"https://cdn-images-1.medium.com/max/4000/1*i3SuhBo3VEC8G79ee1CQ5w.jpeg\"]}"
}
]
}sebastianboldtpublished a new post: learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 17:59:54
sebastianboldtpublished a new post: learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 17:59:54
| 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> <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>. </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)-> ())</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> 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> </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> switch event { <br> case .next(let value):<br> print(value)<br> case .error(let error):<br> print(error)<br> case .completed:<br> print("completed")<br> }<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->())). 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> 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 </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 & 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> 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> 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: 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. Web-App: <a href="http://rxmarbles.com/">http://rxmarbles.com</a> iOS-App: <a href="https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8">https://itunes.apple.com/com/app/rxmarbles/id1087272442</a> 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> </p> <pre><code>Observable.of(1,2,3,4).map { value in <br> return value * 10<br> }.subscribe(onNext:{<br> 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. </p> <pre><code>let sequence1 = Observable.of(1,2)<br> let sequence2 = Observable.of(1,2)<br> <br> let sequenceOfSequences = Observable.of(sequence1,sequence2)<br> sequenceOfSequences.flatMap{ return $0 }.subscribe(onNext:{<br> 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. </p> <pre><code>Observable.of(1,2,3,4,5).scan(0) { seed, value in<br> return seed + value<br> }.subscribe(onNext:{<br> 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. </p> <pre><code>SequenceThatEmitsWithDifferentIntervals<br> .buffer(timeSpan: 150, count: 3, scheduler:s)<br> .subscribe(onNext:{<br> 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. </p> <pre><code>Observable.of(2,30,22,5,60,1).filter{$0 > 10}.subscribe(onNext:{<br> 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. </p> <pre><code>Observable.of(1,2,2,1,3).distinctUntilChanged().subscribe(onNext:{<br> print($0)<br> })<br> <strong>OUTPUT: 1 2 1 3</strong></code></pre> <p>Other filter operators you should try: </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. </p> <pre><code>Observable.of(2,3).startWith(1).subscribe(onNext:{<br> 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. </p> <pre><code>let publish1 = PublishSubject()<br> let publish2 = PublishSubject()<em><strong><br> <br> </strong></em>Observable.of(publish1,publish2).merge().subscribe(onNext:{<br> 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. </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> 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> $0 * 10 *// This has no effect on the actual subscription<br> *}).subscribe(onNext:{<br> 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> </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> .observeOn(concurrentScheduler)<br> .merge()<br> .subscribeOn(MainScheduler())<br> .subscribe(onNext:{<br> print($0)<br> })<br> <br> publish1.onNext(20)<br> publish1.onNext(40)<br> <strong>OUTPUT: 20 40 </strong></code></pre> <h2>It’s a wrap 🎁</h2> <p>Congratulation, you learned the basics of RxSwift. Happy Coding 🎉 Learn & 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> 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 Info | Block #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>. </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)-> ())</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 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> </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 switch event { <br>\n case .next(let value):<br>\n print(value)<br>\n case .error(let error):<br>\n print(error)<br>\n case .completed:<br>\n print(\"completed\")<br>\n }<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->())). 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 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 </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 & 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 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 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: 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. Web-App: <a href=\"http://rxmarbles.com/\">http://rxmarbles.com</a> iOS-App: <a href=\"https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8\">https://itunes.apple.com/com/app/rxmarbles/id1087272442</a> 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> </p>\n<pre><code>Observable.of(1,2,3,4).map { value in <br>\n return value * 10<br>\n}.subscribe(onNext:{<br>\n 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. </p>\n<pre><code>let sequence1 = Observable.of(1,2)<br>\nlet sequence2 = Observable.of(1,2)<br>\n<br>\nlet sequenceOfSequences = Observable.of(sequence1,sequence2)<br>\nsequenceOfSequences.flatMap{ return $0 }.subscribe(onNext:{<br>\n 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. </p>\n<pre><code>Observable.of(1,2,3,4,5).scan(0) { seed, value in<br>\n return seed + value<br>\n}.subscribe(onNext:{<br>\n 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. </p>\n<pre><code>SequenceThatEmitsWithDifferentIntervals<br>\n .buffer(timeSpan: 150, count: 3, scheduler:s)<br>\n .subscribe(onNext:{<br>\n 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. </p>\n<pre><code>Observable.of(2,30,22,5,60,1).filter{$0 > 10}.subscribe(onNext:{<br>\n 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. </p>\n<pre><code>Observable.of(1,2,2,1,3).distinctUntilChanged().subscribe(onNext:{<br>\n print($0)<br>\n})<br>\n<strong>OUTPUT: 1 2 1 3</strong></code></pre>\n<p>Other filter operators you should try: </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. </p>\n<pre><code>Observable.of(2,3).startWith(1).subscribe(onNext:{<br>\n 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. </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 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. </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 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 $0 * 10 *// This has no effect on the actual subscription<br>\n*}).subscribe(onNext:{<br>\n 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> </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 .observeOn(concurrentScheduler)<br>\n .merge()<br>\n .subscribeOn(MainScheduler())<br>\n .subscribe(onNext:{<br>\n print($0)<br>\n})<br>\n<br>\npublish1.onNext(20)<br>\npublish1.onNext(40)<br>\n<strong>OUTPUT: 20 40 </strong></code></pre>\n<h2>It’s a wrap 🎁</h2>\n<p>Congratulation, you learned the basics of RxSwift. Happy Coding 🎉 Learn & 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> 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\"}"
}
]
}sebastianboldtpublished a new post: learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 17:59:09
sebastianboldtpublished a new post: learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 17:59:09
| 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> <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>. </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)-> ())</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> 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> </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> switch event { <br> case .next(let value):<br> print(value)<br> case .error(let error):<br> print(error)<br> case .completed:<br> print("completed")<br> }<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->())). 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> 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 </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 & 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> 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> 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: 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. Web-App: <a href="http://rxmarbles.com/">http://rxmarbles.com</a> iOS-App: <a href="https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8">https://itunes.apple.com/com/app/rxmarbles/id1087272442</a> 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> </p> <pre><code>Observable.of(1,2,3,4).map { value in <br> return value * 10<br> }.subscribe(onNext:{<br> 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. </p> <pre><code>let sequence1 = Observable.of(1,2)<br> let sequence2 = Observable.of(1,2)<br> <br> let sequenceOfSequences = Observable.of(sequence1,sequence2)<br> sequenceOfSequences.flatMap{ return $0 }.subscribe(onNext:{<br> 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. </p> <pre><code>Observable.of(1,2,3,4,5).scan(0) { seed, value in<br> return seed + value<br> }.subscribe(onNext:{<br> 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. </p> <pre><code>SequenceThatEmitsWithDifferentIntervals<br> .buffer(timeSpan: 150, count: 3, scheduler:s)<br> .subscribe(onNext:{<br> 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. </p> <pre><code>Observable.of(2,30,22,5,60,1).filter{$0 > 10}.subscribe(onNext:{<br> 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. </p> <pre><code>Observable.of(1,2,2,1,3).distinctUntilChanged().subscribe(onNext:{<br> print($0)<br> })<br> <strong>OUTPUT: 1 2 1 3</strong></code></pre> <p>Other filter operators you should try: </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. </p> <pre><code>Observable.of(2,3).startWith(1).subscribe(onNext:{<br> 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. </p> <pre><code>let publish1 = PublishSubject()<br> let publish2 = PublishSubject()<em><strong><br> <br> </strong></em>Observable.of(publish1,publish2).merge().subscribe(onNext:{<br> 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. </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> 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> $0 * 10 *// This has no effect on the actual subscription<br> *}).subscribe(onNext:{<br> 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> </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> .observeOn(concurrentScheduler)<br> .merge()<br> .subscribeOn(MainScheduler())<br> .subscribe(onNext:{<br> print($0)<br> })<br> <br> publish1.onNext(20)<br> publish1.onNext(40)<br> <strong>OUTPUT: 20 40 </strong></code></pre> <h2>It’s a wrap 🎁</h2> <p>Congratulation, you learned the basics of RxSwift. Happy Coding 🎉 Learn & 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> 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 Info | Block #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>. </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)-> ())</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 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> </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 switch event { <br>\n case .next(let value):<br>\n print(value)<br>\n case .error(let error):<br>\n print(error)<br>\n case .completed:<br>\n print(\"completed\")<br>\n }<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->())). 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 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 </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 & 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 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 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: 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. Web-App: <a href=\"http://rxmarbles.com/\">http://rxmarbles.com</a> iOS-App: <a href=\"https://itunes.apple.com/com/app/rxmarbles/id1087272442?mt=8\">https://itunes.apple.com/com/app/rxmarbles/id1087272442</a> 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> </p>\n<pre><code>Observable.of(1,2,3,4).map { value in <br>\n return value * 10<br>\n}.subscribe(onNext:{<br>\n 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. </p>\n<pre><code>let sequence1 = Observable.of(1,2)<br>\nlet sequence2 = Observable.of(1,2)<br>\n<br>\nlet sequenceOfSequences = Observable.of(sequence1,sequence2)<br>\nsequenceOfSequences.flatMap{ return $0 }.subscribe(onNext:{<br>\n 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. </p>\n<pre><code>Observable.of(1,2,3,4,5).scan(0) { seed, value in<br>\n return seed + value<br>\n}.subscribe(onNext:{<br>\n 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. </p>\n<pre><code>SequenceThatEmitsWithDifferentIntervals<br>\n .buffer(timeSpan: 150, count: 3, scheduler:s)<br>\n .subscribe(onNext:{<br>\n 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. </p>\n<pre><code>Observable.of(2,30,22,5,60,1).filter{$0 > 10}.subscribe(onNext:{<br>\n 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. </p>\n<pre><code>Observable.of(1,2,2,1,3).distinctUntilChanged().subscribe(onNext:{<br>\n print($0)<br>\n})<br>\n<strong>OUTPUT: 1 2 1 3</strong></code></pre>\n<p>Other filter operators you should try: </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. </p>\n<pre><code>Observable.of(2,3).startWith(1).subscribe(onNext:{<br>\n 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. </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 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. </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 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 $0 * 10 *// This has no effect on the actual subscription<br>\n*}).subscribe(onNext:{<br>\n 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> </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 .observeOn(concurrentScheduler)<br>\n .merge()<br>\n .subscribeOn(MainScheduler())<br>\n .subscribe(onNext:{<br>\n print($0)<br>\n})<br>\n<br>\npublish1.onNext(20)<br>\npublish1.onNext(40)<br>\n<strong>OUTPUT: 20 40 </strong></code></pre>\n<h2>It’s a wrap 🎁</h2>\n<p>Congratulation, you learned the basics of RxSwift. Happy Coding 🎉 Learn & 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> 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
2017/11/10 17:56:30
| 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 | **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> | | |
| json metadata | {"app": "pysteem/0.5.6"} |
| Transaction Info | Block #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> | |",
"json_metadata": "{\"app\": \"pysteem/0.5.6\"}"
}
]
}sebastianboldtpublished a new post: 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 17:55:39
sebastianboldtpublished a new post: 7xgjx6-learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 17:55:39
| 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> <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)-> ())</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> 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> switch event { <br> case .next(let value):<br> print(value)<br> case .error(let error):<br> print(error)<br> case .completed:<br> print("completed")<br> }<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->())).<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> 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 & 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> 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> 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> return value * 10<br> }.subscribe(onNext:{<br> 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 = Observable.of(1,2)<br> let sequence2 = Observable.of(1,2)<br> <br> let sequenceOfSequences = Observable.of(sequence1,sequence2)<br> sequenceOfSequences.flatMap{ return $0 }.subscribe(onNext:{<br> 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> return seed + value<br> }.subscribe(onNext:{<br> 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> .buffer(timeSpan: 150, count: 3, scheduler:s)<br> .subscribe(onNext:{<br> 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 > 10}.subscribe(onNext:{<br> 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> 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> 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> 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> 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> $0 * 10 *// This has no effect on the actual subscription<br> *}).subscribe(onNext:{<br> 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> .observeOn(concurrentScheduler)<br> .merge()<br> .subscribeOn(MainScheduler())<br> .subscribe(onNext:{<br> print($0)<br> })<br> <br> publish1.onNext(20)<br> publish1.onNext(40)</code></pre> <pre><code><strong>OUTPUT: 20 40 </strong></code></pre> <h2>It’s a wrap 🎁</h2> <p>Congratulation, you learned the basics of RxSwift. Happy Coding 🎉<br> Learn & 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 Info | Block #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)-> ())</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 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 switch event { <br>\n case .next(let value):<br>\n print(value)<br>\n case .error(let error):<br>\n print(error)<br>\n case .completed:<br>\n print(\"completed\")<br>\n }<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->())).<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 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 & 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 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 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 return value * 10<br>\n}.subscribe(onNext:{<br>\n 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 = Observable.of(1,2)<br>\nlet sequence2 = Observable.of(1,2)<br>\n<br>\nlet sequenceOfSequences = Observable.of(sequence1,sequence2)<br>\nsequenceOfSequences.flatMap{ return $0 }.subscribe(onNext:{<br>\n 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 return seed + value<br>\n}.subscribe(onNext:{<br>\n 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 .buffer(timeSpan: 150, count: 3, scheduler:s)<br>\n .subscribe(onNext:{<br>\n 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 > 10}.subscribe(onNext:{<br>\n 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 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 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 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 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 $0 * 10 *// This has no effect on the actual subscription<br>\n*}).subscribe(onNext:{<br>\n 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 .observeOn(concurrentScheduler)<br>\n .merge()<br>\n .subscribeOn(MainScheduler())<br>\n .subscribe(onNext:{<br>\n print($0)<br>\n})<br>\n<br>\npublish1.onNext(20)<br>\npublish1.onNext(40)</code></pre>\n<pre><code><strong>OUTPUT: 20 40 </strong></code></pre>\n<h2>It’s a wrap 🎁</h2>\n<p>Congratulation, you learned the basics of RxSwift. Happy Coding 🎉<br>\nLearn & 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\"}"
}
]
}salutonreplied to @sebastianboldt / ah9ggpi5h0kcf4xsy5fnfg2017/11/10 17:50:30
salutonreplied to @sebastianboldt / ah9ggpi5h0kcf4xsy5fnfg
2017/11/10 17:50:30
| 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": [""]} |
| Transaction Info | Block #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\": [\"\"]}"
}
]
}salutonupvoted (84.00%) @sebastianboldt / learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 17:50:09
salutonupvoted (84.00%) @sebastianboldt / learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 17:50:09
| voter | saluton |
| author | sebastianboldt |
| permlink | learn-and-master-the-basics-of-rxswift-in-10-minutes |
| weight | 8400 (84.00%) |
| Transaction Info | Block #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
2017/11/10 17:43:36
| 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 | **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> | | |
| json metadata | {"app": "pysteem/0.5.6"} |
| Transaction Info | Block #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> | |",
"json_metadata": "{\"app\": \"pysteem/0.5.6\"}"
}
]
}sebastianboldtupvoted (100.00%) @sebastianboldt / learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 17:42:42
sebastianboldtupvoted (100.00%) @sebastianboldt / learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 17:42:42
| voter | sebastianboldt |
| author | sebastianboldt |
| permlink | learn-and-master-the-basics-of-rxswift-in-10-minutes |
| weight | 10000 (100.00%) |
| Transaction Info | Block #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
}
]
}sebastianboldtpublished a new post: learn-and-master-the-basics-of-rxswift-in-10-minutes2017/11/10 17:42:42
sebastianboldtpublished a new post: learn-and-master-the-basics-of-rxswift-in-10-minutes
2017/11/10 17:42:42
| 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> <p><strong>export</strong></p> <ul> <li><strong>copy to clipboard</strong></li> <li><strong>history</strong></li> </ul> <h2>Learn & 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)-> ())</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> 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> switch event {<br> case .next(let value):<br> print(value)<br> case .error(let error):<br> print(error)<br> case .completed:<br> print("completed")<br> }<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->())).</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> 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 & 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> 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> 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> return value * 10<br> }.subscribe(onNext:{<br> 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 = Observable.of(1,2)<br> let sequence2 = Observable.of(1,2)<br> <br> let sequenceOfSequences = Observable.of(sequence1,sequence2)<br> <br> sequenceOfSequences.flatMap{ return $0 }.subscribe(onNext:{<br> 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> return seed + value<br> }.subscribe(onNext:{<br> 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> .buffer(timeSpan: 150, count: 3, scheduler:s)<br> .subscribe(onNext:{<br> print($0)<br> })<br> <br> **OUTPUT: [1] [2,3] [4] [5,6] [7] []** </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 > 10}.subscribe(onNext:{<br> 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> 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> 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> 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> 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> $0 * 10 *// This has no effect on the actual subscription<br> *}).subscribe(onNext:{<br> 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> .observeOn(concurrentScheduler)<br> .merge()<br> .subscribeOn(MainScheduler())<br> .subscribe(onNext:{<br> print($0)<br> })<br> <br> publish1.onNext(20)<br> publish1.onNext(40)<br> <br> OUTPUT: 20 40 </code></pre> <h2>It’s a wrap 🎁</h2> <p>Congratulation, you learned the basics of RxSwift. Happy Coding 🎉<br> <em><strong>Learn & 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 Info | Block #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 & 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)-> ())</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 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 switch event {<br>\n case .next(let value):<br>\n print(value)<br>\n case .error(let error):<br>\n print(error)<br>\n case .completed:<br>\n print(\"completed\")<br>\n }<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->())).</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 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 & 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 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 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 return value * 10<br>\n}.subscribe(onNext:{<br>\n 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 = Observable.of(1,2)<br>\nlet sequence2 = Observable.of(1,2)<br>\n<br>\nlet sequenceOfSequences = Observable.of(sequence1,sequence2)<br>\n<br>\nsequenceOfSequences.flatMap{ return $0 }.subscribe(onNext:{<br>\n 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 return seed + value<br>\n}.subscribe(onNext:{<br>\n 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 .buffer(timeSpan: 150, count: 3, scheduler:s)<br>\n .subscribe(onNext:{<br>\n print($0)<br>\n})<br>\n<br>\n**OUTPUT: [1] [2,3] [4] [5,6] [7] []** </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 > 10}.subscribe(onNext:{<br>\n 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 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 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 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 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 $0 * 10 *// This has no effect on the actual subscription<br>\n*}).subscribe(onNext:{<br>\n 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 .observeOn(concurrentScheduler)<br>\n .merge()<br>\n .subscribeOn(MainScheduler())<br>\n .subscribe(onNext:{<br>\n print($0)<br>\n})<br>\n<br>\npublish1.onNext(20)<br>\npublish1.onNext(40)<br>\n<br>\nOUTPUT: 20 40 </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 & 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 properties2017/11/10 17:37:42
sebastianboldtupdated their account properties
2017/11/10 17:37:42
| account | sebastianboldt |
| memo key | STM7AiKN6QHNhmcJtVNoeyDi766EEYUZKGmn1nhZeaiGVSioZkrFt |
| json metadata | {"profile":{"profile_image":"https://i1.sndcdn.com/avatars-000341171874-uorr00-t500x500.jpg","website":"http://sebastianboldt.com"}} |
| Transaction Info | Block #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 properties2017/11/10 17:36:48
sebastianboldtupdated their account properties
2017/11/10 17:36:48
| account | sebastianboldt |
| memo key | STM7AiKN6QHNhmcJtVNoeyDi766EEYUZKGmn1nhZeaiGVSioZkrFt |
| json metadata | {"profile":{"website":"http://sebastianboldt.com"}} |
| Transaction Info | Block #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: @sebastianboldt2017/11/10 15:26:21
steemcreated a new account: @sebastianboldt
2017/11/10 15:26:21
| 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 | [] |
| Transaction Info | Block #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": []
}
]
}Manabar
Voting Power100.00%
Downvote Power100.00%
Resource Credits100.00%
Reputation Progress91.74%
{
"voting_manabar": {
"current_mana": "8143659806",
"last_update_time": 1779084984
},
"downvote_manabar": {
"current_mana": 2035914951,
"last_update_time": 1779084984
},
"rc_account": {
"account": "sebastianboldt",
"rc_manabar": {
"current_mana": "10164408779",
"last_update_time": 1779084984
},
"max_rc_creation_adjustment": {
"amount": "2020748973",
"precision": 6,
"nai": "@@000000037"
},
"max_rc": "10164408779"
}
}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.
[]