콘텐츠로 이동

# Signal - 이벤트 생성과 연결

읽기 전...

모듈 설정시 `.Init()` 처럼 QuadId 란을 비워두는 경우 `Bindable`, `Disconnecter` 기능이 코드를 넘어 공유되지 않습니다
하지만 `.Init("Project1")` 처럼 아이디를 부여하는 경우 다른 모듈, 로컬스크립트가 접근하더라도 같은 QuadId 를 가졌다면 `Bindable`, `Disconnecter` 는 공유됩니다

Quad 에는 편의상의 이유로 로블록스의 `RBXScriptSignal` 의 유사품과, 한번에 시그널을 끊어주는 `Disconnecter` 를 제공합니다.
이는 내부적으로 `Extend` 의 `GetPropertyChangedSignal` 같은 곳에서 사용되기도 합니다.

## Bindable

Bindable 은 `RBXScriptSignal` 과 유사한 객체입니다. `Signal.Bindable.New(id:string?)` 으로 생성할 수 있습니다.
로블록스의 기본 `BindableEvent` 와는 다르게 `:Fire` 가 한곳에 합쳐져 있습니다.

Note

만약 `id` 를 지정한 경우, 같은 `id` 를 가진 `Bindable` 이 있으면 이전것을 반환합니다.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28

    local Quad = require(path.to.module).Init()
    local Signal = Quad.Signal

    local mySignal = Signal.Bindable.New()

    local connection = mySignal:Connect(function(v)
        print(v)
    end)
    mySignal:Fire("이 메시지는 출력되어야 합니다.")
    connection:Disconnect()
    mySignal:Fire("이 메시지는 출력되면 안됩니다.")

    task.spawn(function()
        task.wait(5)
        mySignal:Fire("이 메시지는 지연된 후 출력되어야 합니다.")
    end)
    print(mySignal:Wait())

    mySignal:Once(function(v)
        print(v)
    end)
    mySignal:Fire("이 메시지는 출력되어야 합니다.")
    mySignal:Fire("이 메시지는 출력되면 안됩니다.")

    mySignal:Once(function(v)
        print(v)
    end):Disconnect()
    mySignal:Fire("이 메시지는 출력되면 안됩니다.")

### Bindable 메소드

`Bindable` 에는 다음과 같은 메소드들이 제공됩니다.

`:Fire(...any)`

> 등록된 연결들을 실행하고, `Wait` 을 풀어줍니다.

`:Wait()->(...any)`

> `Fire` 가 호출될 때 까지 기다립니다. `Fire` 에 사용된 값이 반환됩니다.

`:Connect((...any)->())->Connection`

> `Fire` 가 호출 될 때 함수가 실행되도록 만듭니다. `Fire` 에 사용된 값이 호출 인자로 사용됩니다. 연결을 끊을 수 있도록 `Connection` 이 제공됩니다.

`:Once((...any)->())->Connection`

> `Connect` 와 유사하지만, `Fire` 가 한번 호출된 뒤 연결이 끊어집니다/

`:CheckConnected(func)->boolean`

> 함수가 이미 등록되어 있는지 여부를 반환합니다.

`:DisconnectAll()`

> 모든 연결을 끊습니다. `Wait` 으로 기다리고 있는 곳에는 `nil` 을 반환합니다.

`:Destroy()`

> `:DisconnectAll()` 를 수행한 후, 객체를 더이상 사용할 수 없도록 만듭니다.
> `id` 가 등록되어 있는경우 저장소에서 파기하게 됩니다.

### Connection 메소드

Bindable:Connect 와 Bindable:Once 는 `Connection` 을 반환합니다. `Connection` 에는 다음과 같은 메소드들이 제공됩니다.

`:Disconnect()`

> 연결을 끊습니다. `Fire` 가 호출되더라도 `Connect` 혹은 `Once` 에 사용된 함수가 실행되지 않습니다.

`:Destroy()`

> `:Disconnect()` 의 별칭입니다.

## Disconnecter

`Disconnecter` 는 일종의 `Maid` 모듈과 비슷한 객체입니다. 이 객체에는 `Connection` (로블록스, Quad 모두 호환) 을 추가할 수 있으며, 나중에 추가된 `Connection` 을 한꺼번에 `Disconnect` 할 수 있습니다. `Signal.Disconnecter.New(id:string?)` 으로 생성할 수 있습니다.

Note

만약 `id` 를 지정한 경우, 같은 `id` 를 가진 `Bindable` 이 있으면 이전것을 반환합니다.

`:Add(connection:Connection|RBXScriptConnection)`

> `connection`을 리스트에 추가합니다. 나중에 `:Disconnect`를 호출하면 추가된 연결이 파기됩니다.

`:Disconnect()`

> 추가된 모든 연결에 `Disconnect()` 를 수행합니다. 이 호출 후에 추가된 연결은 모두 사라지며. 이 요청 후에도 다시 `:Add` 를 사용할 수 있습니다
> Disconnecter 를 완전히 사용하지 못하도록 하려면 `:Destroy` 를 호출하세요

`:Destroy()`

> `:Disconnect()` 를 수행한 후, 객체를 더이상 사용할 수 없도록 만듭니다.
> `id` 가 등록되어 있는경우 저장소에서 파기하게 됩니다.

맨위로