Skip to content

Commit 41b0073

Browse files
authored
Dispatch getData callbacks on FRepo callback queue (#8247)
1 parent f987246 commit 41b0073

File tree

3 files changed

+37
-12
lines changed

3 files changed

+37
-12
lines changed

FirebaseDatabase/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# v8.5.0
2+
- [fixed] FirebaseDatabase `getData()` callbacks are now called on the main thread. (#8247)
3+
14
# v8.0.0
25
- [added] Added abuse reduction features. (#7928, #7943)
36

FirebaseDatabase/Sources/Core/FRepo.m

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -525,11 +525,13 @@ - (void)getData:(FIRDatabaseQuery *)query
525525
FQuerySpec *querySpec = [query querySpec];
526526
id<FNode> node = [self.serverSyncTree getServerValue:[query querySpec]];
527527
if (node != nil) {
528-
block(nil, [[FIRDataSnapshot alloc]
529-
initWithRef:query.ref
530-
indexedNode:[FIndexedNode
531-
indexedNodeWithNode:node
532-
index:querySpec.index]]);
528+
[self.eventRaiser raiseCallback:^{
529+
block(nil, [[FIRDataSnapshot alloc]
530+
initWithRef:query.ref
531+
indexedNode:[FIndexedNode
532+
indexedNodeWithNode:node
533+
index:querySpec.index]]);
534+
}];
533535
return;
534536
}
535537
[self.persistenceManager setQueryActive:querySpec];
@@ -554,26 +556,33 @@ - (void)getData:(FIRDatabaseQuery *)query
554556
@"and no matching disk cache entries",
555557
querySpec]
556558
};
557-
block([NSError errorWithDomain:kFirebaseCoreErrorDomain
558-
code:1
559-
userInfo:errorDict],
560-
nil);
559+
[self.eventRaiser raiseCallback:^{
560+
block([NSError errorWithDomain:kFirebaseCoreErrorDomain
561+
code:1
562+
userInfo:errorDict],
563+
nil);
564+
}];
561565
return;
562566
}
563-
block(nil, [[FIRDataSnapshot alloc] initWithRef:query.ref
564-
indexedNode:node]);
567+
[self.eventRaiser raiseCallback:^{
568+
block(nil, [[FIRDataSnapshot alloc] initWithRef:query.ref
569+
indexedNode:node]);
570+
}];
565571
} else {
566572
node = [FSnapshotUtilities nodeFrom:data];
567573
[self.eventRaiser
568574
raiseEvents:[self.serverSyncTree
569575
applyServerOverwriteAtPath:[query path]
570576
newData:node]];
571-
block(nil,
577+
[self.eventRaiser raiseCallback:^{
578+
block(
579+
nil,
572580
[[FIRDataSnapshot alloc]
573581
initWithRef:query.ref
574582
indexedNode:[FIndexedNode
575583
indexedNodeWithNode:node
576584
index:querySpec.index]]);
585+
}];
577586
}
578587
[self.persistenceManager setQueryInactive:querySpec];
579588
}];

FirebaseDatabase/Tests/Integration/FIRDatabaseQueryTests.m

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4121,6 +4121,19 @@ - (void)testGetForEmptyNodeReturnsNull {
41214121
WAIT_FOR(done);
41224122
}
41234123

4124+
- (void)testGetInvokesCallbacksOnMainThread {
4125+
FIRDatabaseReference* ref = [FTestHelpers getRandomNode];
4126+
4127+
__block BOOL done = NO;
4128+
4129+
[ref getDataWithCompletionBlock:^(NSError* err, FIRDataSnapshot* snapshot) {
4130+
XCTAssert([[NSThread currentThread] isMainThread]);
4131+
done = YES;
4132+
}];
4133+
4134+
WAIT_FOR(done);
4135+
}
4136+
41244137
- (void)testGetForNodeReturnsCorrectValue {
41254138
FIRDatabaseReference* ref = [FTestHelpers getRandomNode];
41264139

0 commit comments

Comments
 (0)