Switch to something like “Blocks”?

Another thing to look into is whether or not each invocation really does have a likelihood to call any of the cases. This is very dependent upon how the overall code is organized, but it may be that there are actually logical “sets” of cases that could be better grouped. Perhaps there is more of a hierarchy that could be used to reduce the number of final cases being evaluated.

That being said, I think your approach with the dictionary of delegate functions would probably be the next step if pure performance of your current code organization. It sounds like the thing you most dislike is the fact that you can’t have that code inline (i.e. ObjC blocks), but have to split the methods out.

Another thing you might consider is whether or not the caller could be pre-configured to call the right delegate function ahead of time. For example, if you have some object that is calling into this function, rather than having some value that is used in your switch statement, perhaps it could immediately be assigned the correct delegate method sometime earlier in your program. That way, at the time of invocation, there is no delay, it simply calls the correct delegate immediately. This, of course, may have other performance implications depending upon how often this value would need to change.