Skip to content

Commit f59872c

Browse files
committed
Adding synchronous delegate setters which may be handy in some situations.
1 parent 358afb3 commit f59872c

File tree

2 files changed

+103
-86
lines changed

2 files changed

+103
-86
lines changed

GCD/GCDAsyncSocket.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,12 +111,15 @@ typedef enum GCDAsyncSocketError GCDAsyncSocketError;
111111

112112
- (id)delegate;
113113
- (void)setDelegate:(id)delegate;
114+
- (void)synchronouslySetDelegate:(id)delegate;
114115

115116
- (dispatch_queue_t)delegateQueue;
116117
- (void)setDelegateQueue:(dispatch_queue_t)delegateQueue;
118+
- (void)synchronouslySetDelegateQueue:(dispatch_queue_t)delegateQueue;
117119

118120
- (void)getDelegate:(id *)delegatePtr delegateQueue:(dispatch_queue_t *)delegateQueuePtr;
119121
- (void)setDelegate:(id)delegate delegateQueue:(dispatch_queue_t)delegateQueue;
122+
- (void)synchronouslySetDelegate:(id)delegate delegateQueue:(dispatch_queue_t)delegateQueue;
120123

121124
/**
122125
* Traditionally sockets are not closed until the conversation is over.

GCD/GCDAsyncSocket.m

Lines changed: 100 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -904,20 +904,33 @@ - (id)delegate
904904
}
905905
}
906906

907-
- (void)setDelegate:(id)newDelegate
907+
- (void)setDelegate:(id)newDelegate synchronously:(BOOL)synchronously
908908
{
909-
if (dispatch_get_current_queue() == socketQueue)
910-
{
909+
dispatch_block_t block = ^{
911910
delegate = newDelegate;
911+
};
912+
913+
if (dispatch_get_current_queue() == socketQueue) {
914+
block();
912915
}
913-
else
914-
{
915-
dispatch_async(socketQueue, ^{
916-
delegate = newDelegate;
917-
});
916+
else {
917+
if (synchronously)
918+
dispatch_sync(socketQueue, block);
919+
else
920+
dispatch_async(socketQueue, block);
918921
}
919922
}
920923

924+
- (void)setDelegate:(id)newDelegate
925+
{
926+
[self setDelegate:newDelegate synchronously:NO];
927+
}
928+
929+
- (void)synchronouslySetDelegate:(id)newDelegate
930+
{
931+
[self setDelegate:newDelegate synchronously:YES];
932+
}
933+
921934
- (dispatch_queue_t)delegateQueue
922935
{
923936
if (dispatch_get_current_queue() == socketQueue)
@@ -936,33 +949,40 @@ - (dispatch_queue_t)delegateQueue
936949
}
937950
}
938951

939-
- (void)setDelegateQueue:(dispatch_queue_t)newDelegateQueue
952+
- (void)setDelegateQueue:(dispatch_queue_t)newDelegateQueue synchronously:(BOOL)synchronously
940953
{
941-
if (dispatch_get_current_queue() == socketQueue)
942-
{
954+
dispatch_block_t block = ^{
955+
943956
if (delegateQueue)
944957
dispatch_release(delegateQueue);
945958

946959
if (newDelegateQueue)
947960
dispatch_retain(newDelegateQueue);
948961

949962
delegateQueue = newDelegateQueue;
963+
};
964+
965+
if (dispatch_get_current_queue() == socketQueue) {
966+
block();
950967
}
951-
else
952-
{
953-
dispatch_async(socketQueue, ^{
954-
955-
if (delegateQueue)
956-
dispatch_release(delegateQueue);
957-
958-
if (newDelegateQueue)
959-
dispatch_retain(newDelegateQueue);
960-
961-
delegateQueue = newDelegateQueue;
962-
});
968+
else {
969+
if (synchronously)
970+
dispatch_sync(socketQueue, block);
971+
else
972+
dispatch_async(socketQueue, block);
963973
}
964974
}
965975

976+
- (void)setDelegateQueue:(dispatch_queue_t)newDelegateQueue
977+
{
978+
[self setDelegateQueue:newDelegateQueue synchronously:NO];
979+
}
980+
981+
- (void)synchronouslySetDelegateQueue:(dispatch_queue_t)newDelegateQueue
982+
{
983+
[self setDelegateQueue:newDelegateQueue synchronously:YES];
984+
}
985+
966986
- (void)getDelegate:(id *)delegatePtr delegateQueue:(dispatch_queue_t *)delegateQueuePtr
967987
{
968988
if (dispatch_get_current_queue() == socketQueue)
@@ -985,10 +1005,10 @@ - (void)getDelegate:(id *)delegatePtr delegateQueue:(dispatch_queue_t *)delegate
9851005
}
9861006
}
9871007

988-
- (void)setDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue
1008+
- (void)setDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue synchronously:(BOOL)synchronously
9891009
{
990-
if (dispatch_get_current_queue() == socketQueue)
991-
{
1010+
dispatch_block_t block = ^{
1011+
9921012
delegate = newDelegate;
9931013

9941014
if (delegateQueue)
@@ -998,24 +1018,29 @@ - (void)setDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQ
9981018
dispatch_retain(newDelegateQueue);
9991019

10001020
delegateQueue = newDelegateQueue;
1021+
};
1022+
1023+
if (dispatch_get_current_queue() == socketQueue) {
1024+
block();
10011025
}
1002-
else
1003-
{
1004-
dispatch_async(socketQueue, ^{
1005-
1006-
delegate = newDelegate;
1007-
1008-
if (delegateQueue)
1009-
dispatch_release(delegateQueue);
1010-
1011-
if (newDelegateQueue)
1012-
dispatch_retain(newDelegateQueue);
1013-
1014-
delegateQueue = newDelegateQueue;
1015-
});
1026+
else {
1027+
if (synchronously)
1028+
dispatch_sync(socketQueue, block);
1029+
else
1030+
dispatch_async(socketQueue, block);
10161031
}
10171032
}
10181033

1034+
- (void)setDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue
1035+
{
1036+
[self setDelegate:newDelegate delegateQueue:newDelegateQueue synchronously:NO];
1037+
}
1038+
1039+
- (void)synchronouslySetDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue
1040+
{
1041+
[self setDelegate:newDelegate delegateQueue:newDelegateQueue synchronously:YES];
1042+
}
1043+
10191044
- (BOOL)autoDisconnectOnClosedReadStream
10201045
{
10211046
// Note: YES means kAllowHalfDuplexConnection is OFF
@@ -1040,22 +1065,18 @@ - (void)setAutoDisconnectOnClosedReadStream:(BOOL)flag
10401065
{
10411066
// Note: YES means kAllowHalfDuplexConnection is OFF
10421067

1043-
if (dispatch_get_current_queue() == socketQueue)
1044-
{
1068+
dispatch_block_t block = ^{
1069+
10451070
if (flag)
10461071
config &= ~kAllowHalfDuplexConnection;
10471072
else
10481073
config |= kAllowHalfDuplexConnection;
1049-
}
1074+
};
1075+
1076+
if (dispatch_get_current_queue() == socketQueue)
1077+
block();
10501078
else
1051-
{
1052-
dispatch_async(socketQueue, ^{
1053-
if (flag)
1054-
config &= ~kAllowHalfDuplexConnection;
1055-
else
1056-
config |= kAllowHalfDuplexConnection;
1057-
});
1058-
}
1079+
dispatch_async(socketQueue, block);
10591080
}
10601081

10611082
- (BOOL)isIPv4Enabled
@@ -1082,22 +1103,18 @@ - (void)setIPv4Enabled:(BOOL)flag
10821103
{
10831104
// Note: YES means kIPv4Disabled is OFF
10841105

1085-
if (dispatch_get_current_queue() == socketQueue)
1086-
{
1106+
dispatch_block_t block = ^{
1107+
10871108
if (flag)
10881109
config &= ~kIPv4Disabled;
10891110
else
10901111
config |= kIPv4Disabled;
1091-
}
1112+
};
1113+
1114+
if (dispatch_get_current_queue() == socketQueue)
1115+
block();
10921116
else
1093-
{
1094-
dispatch_async(socketQueue, ^{
1095-
if (flag)
1096-
config &= ~kIPv4Disabled;
1097-
else
1098-
config |= kIPv4Disabled;
1099-
});
1100-
}
1117+
dispatch_async(socketQueue, block);
11011118
}
11021119

11031120
- (BOOL)isIPv6Enabled
@@ -1124,22 +1141,18 @@ - (void)setIPv6Enabled:(BOOL)flag
11241141
{
11251142
// Note: YES means kIPv6Disabled is OFF
11261143

1127-
if (dispatch_get_current_queue() == socketQueue)
1128-
{
1144+
dispatch_block_t block = ^{
1145+
11291146
if (flag)
11301147
config &= ~kIPv6Disabled;
11311148
else
11321149
config |= kIPv6Disabled;
1133-
}
1150+
};
1151+
1152+
if (dispatch_get_current_queue() == socketQueue)
1153+
block();
11341154
else
1135-
{
1136-
dispatch_async(socketQueue, ^{
1137-
if (flag)
1138-
config &= ~kIPv6Disabled;
1139-
else
1140-
config |= kIPv6Disabled;
1141-
});
1142-
}
1155+
dispatch_async(socketQueue, block);
11431156
}
11441157

11451158
- (BOOL)isIPv4PreferredOverIPv6
@@ -1166,22 +1179,18 @@ - (void)setPreferIPv4OverIPv6:(BOOL)flag
11661179
{
11671180
// Note: YES means kPreferIPv6 is OFF
11681181

1169-
if (dispatch_get_current_queue() == socketQueue)
1170-
{
1182+
dispatch_block_t block = ^{
1183+
11711184
if (flag)
11721185
config &= ~kPreferIPv6;
11731186
else
11741187
config |= kPreferIPv6;
1175-
}
1188+
};
1189+
1190+
if (dispatch_get_current_queue() == socketQueue)
1191+
block();
11761192
else
1177-
{
1178-
dispatch_async(socketQueue, ^{
1179-
if (flag)
1180-
config &= ~kPreferIPv6;
1181-
else
1182-
config |= kPreferIPv6;
1183-
});
1184-
}
1193+
dispatch_async(socketQueue, block);
11851194
}
11861195

11871196
- (id)userData
@@ -1203,14 +1212,19 @@ - (id)userData
12031212

12041213
- (void)setUserData:(id)arbitraryUserData
12051214
{
1206-
dispatch_async(socketQueue, ^{
1215+
dispatch_block_t block = ^{
12071216

12081217
if (userData != arbitraryUserData)
12091218
{
12101219
[userData release];
12111220
userData = [arbitraryUserData retain];
12121221
}
1213-
});
1222+
};
1223+
1224+
if (dispatch_get_current_queue() == socketQueue)
1225+
block();
1226+
else
1227+
dispatch_async(socketQueue, block);
12141228
}
12151229

12161230
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
 (0)