Actor-eristys ja nonisolated
Päättele eristysrajojen toimintaa.
Actor-eristys ja nonisolated on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Swift Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Swift Academy-kurssilla on yhteensä 4 oppituntia.
Mitä actor-eristys tarkoittaa
Actor-eristys tarkoittaa, että actorin muokattavaan tilaan voi koskea vain actorilla suoritettava koodi.
Ajoympäristö sarjallistaa käytön, joten kaksi tehtävää ei koskaan muuta tilaa samanaikaisesti. Näin datakilpailut poistuvat.
actor Counter {
private var value = 0
func increment() { value += 1 }
}Kutsuminen actorille
Actorin ulkopuolelta eristettyjen jäsenten käyttäminen on asynkronista. Teidän on käytettävä await-sanaa, koska kutsu voi keskeytyä, kunnes actor vapautuu.
let counter = Counter()
func useCounter() async {
await counter.increment()
}Actorin sisällä: synkronisesti
Actorin omissa metodeissa olette jo eristetyssä kontekstissa, joten pääsette tilaan käsiksi synkronisesti – await-sanaa ei tarvita self-viitteelle.
actor Counter {
private var value = 0
func incrementTwice() {
value += 1 // synchronous: already isolated
value += 1
}
}nonisolated-jäsenet
Merkitkää jäsen nonisolated-merkinnällä, kun se ei käsittele muokattavaa tilaa. Tällaiset jäsenet suoritetaan synkronisesti mistä tahansa ilman await-sanaa.
Tämä sopii erinomaisesti laskettuihin arvoihin, jotka muodostetaan vain muuttumattomista tiedoista.
actor User {
let id: Int
var sessionCount = 0
init(id: Int) { self.id = id }
nonisolated var label: String { "User #\(id)" }
}Miksi nonisolated on turvallinen
nonisolated-jäsen voi lukea vain muuttumatonta (let) tai muuten Sendable-tilaa.
Kääntäjä hylkää yrityksen käyttää muokattavaa eristettyä tilaa nonisolated-kontekstista.
actor User {
let id: Int
var sessionCount = 0
init(id: Int) { self.id = id }
// Error: cannot read mutable sessionCount here
// nonisolated var bad: Int { sessionCount }
}nonisolated ja protokollat
nonisolated on välttämätön, kun actor toteuttaa synkronisen protokollan. Protokollan metodi ei voi olla asynkroninen, joten se ei saa käyttää eristettyä tilaa.
actor Item: CustomStringConvertible {
let name: String
init(name: String) { self.name = name }
nonisolated var description: String { "Item: \(name)" }
}MainActor
@MainActor on globaali actor, joka eristää koodin pääsäikeeseen. Käyttöliittymän päivitykset kuuluvat tänne.
Merkitkää tyypit, metodit tai ominaisuudet, jos haluatte sitoa ne MainActorille.
@MainActor
final class ViewModel {
var title = "Hello"
func refresh() { title = "Updated" }
}Siirtyminen actorien välillä
Kun kutsutte yhdeltä actorilta toiselle, ajoympäristö siirtyy suorittajalta toiselle ja keskeyttää suorituksen. Juuri tässä keskeytyskohdassa await esiintyy.
actor Database { func load() -> Int { 42 } }
@MainActor
func show(_ db: Database) async {
let v = await db.load() // hop to db actor
print(v) // hop back to main
}Actorien reentrancy
Actorit ovat reentrant: kun metodi odottaa, actor voi suorittaa muuta jonossa olevaa työtä ennen kuin suoritus jatkuu odotuksen jälkeen.
Ennen await-sanaa lukemanne tila on voinut muuttua sen jälkeen. Tarkistakaa oletukset uudelleen keskeytyskohtien jälkeen.
actor Store {
var ready = false
func prepare() async {
ready = false
await Task.yield() // other calls may run here
ready = true
}
}isolated-parametrit
Funktio voi ottaa isolated-actor-parametrin, jolloin sen runko suoritetaan kyseisellä actorilla, vaikka funktio ei ole actorin jäsen.
func bump(on counter: isolated Counter) {
// runs isolated to counter; synchronous access
}Globaalit actorit alijärjestelmille
Voitte määrittää oman globaalin actorin, jolla koko alijärjestelmä (esimerkiksi renderöintiputki) eristetään yhdelle suorittajalle.
@globalActor
actor RenderActor {
static let shared = RenderActor()
}
@RenderActor func draw() { }Pikatarkistus: eristys
Testatkaa ymmärrystänne actor-eristyksestä.
Kertaus: actor-eristys ja nonisolated
Actor-eristys sarjallistaa pääsyn muokattavaan tilaan; actorien väliset kutsut ovat asynkronisia ja edellyttävät await-sanaa. nonisolated-jäsenet jättäytyvät eristyksen ulkopuolelle, mutta voivat lukea vain muuttumatonta tai Sendable-tilaa, mikä on tärkeää synkronisen protokollan toteuttamisessa.
@MainActor sitoo koodin pääsäikeeseen, actorit ovat reentrant-tyyppisiä (tila voi muuttua await-sanan yli), ja globaalit actorit eristävät kokonaisia alijärjestelmiä. Näiden sääntöjen hallitseminen on turvallisen samanaikaisuuden ydin.
Opi Swift tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 122
- Oppitunnit
- 409
Usein kysytyt kysymykset
Onko oppitunti ”Actor-eristys ja nonisolated” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Swift Academy-oppimispolun 3 oppituntia, myös oppitunnin “Actor-eristys ja nonisolated”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Swift Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Actor-eristys ja nonisolated”?
Päättele eristysrajojen toimintaa. Harjoittelet Swift Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Swift Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Swift Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.
Kuinka kauan ”Actor-eristys ja nonisolated”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Swift Academy-oppitunnilla?
Kyllä. Jokainen Swift Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Datakilpailun ongelma
- Sendable-protokolla
- Actor-eristys ja nonisolated
- Siirtyminen tiukkaan samanaikaisuuden tarkistukseen