# Custom

If for some reason, you need to implement your own dispatcher, you must create a `BatchEventDispatcherDelegate` and register it to the SDK using `[BatchEventDispatcher addDispatcher]`.

{% hint style="info" %}
You don't need to add a dispatcher if you're using one of the previous "ready-to-go" library ! It will be automatically registered.
{% endhint %}

{% tabs %}
{% tab title="Swift" %}

```swift
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, BatchEventDispatcherDelegate {
    
    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        BatchSDK.start(withAPIKey: "YOUR_API_KEY")
        
        [...]

        BatchEventDispatcher.add(self)
        return true
    }
    
    func dispatchEvent(with type: BatchEventDispatcherType,
                         payload: BatchEventDispatcherPayload) {
        NSLog("Dispatcher: I'm dispatching an event");
    }
}

```

{% endtab %}

{% tab title="Objective-C" %}

```objectivec

// MYAppDelegate.h

@interface MYAppDelegate : UIResponder <UIApplicationDelegate,
                                        BatchEventDispatcherDelegate>

[...]

@end

// MYAppDelegate.m

@implementation MYAppDelegate

- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [BatchSDK startWithAPIKey:@"MY_API_KEY"];
    
    [...]

    [BatchEventDispatcher addDispatcher:self];
    return YES;
}

- (void)dispatchEventWithType:(BatchEventDispatcherType)type 
                      payload:(nonnull id<BatchEventDispatcherPayload>)payload { 
    NSLog(@"Dispatcher: I'm dispatching an event");
}

@end
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
If the Batch SDK happens to be opt-out from, dispatchers won't receive any events.
{% endhint %}
