Call a Function by Name
Importante
Make sure to sanitize client data to protect against code injection when using Functions.
Considerar un Función de servicios de aplicaciones Atlas denominada
concatenate que toma dos argumentos, los concatena y devuelve el resultado:
// concatenate: concatenate two strings exports = function(a, b) { return a + b; };
To execute a function from the Swift SDK, use the functions object on the currently logged-in user.
The functions object has dynamic members corresponding to functions. In this case, functions.concatenate() refers to the concatenate function. Pass a BSONArray of arguments. The trailing closure is the completion handler to call when the function call is complete. This handler is executed on a non-main global DispatchQueue.
RLMApp *app = [RLMApp appWithId:YOUR_APP_ID]; // ... log in ... RLMUser *user = [app currentUser]; // Call concatenate function [user callFunctionNamed:@"concatenate" arguments:@[@"john.smith", @"@companyemail.com"] completionBlock:^(id<RLMBSON> result, NSError *error) { if (error) { NSLog(@"Function call failed: %@", [error localizedDescription]); return; } NSLog(@"Called function 'concatenate' and got result: %@", result); assert([result isEqual:@"john.smith@companyemail.com"]); }];
let app = App(id: YOUR_APP_SERVICES_APP_ID) // ... log in ... let user = app.currentUser! // The dynamic member name `concatenate` is directly associated with the // function name. The first argument is the `BSONArray` of arguments to be // provided to the function - in this case, a string that represents a // username and a string that represents an email domain. // The trailing closure is the completion handler to call when the function // call is complete. This handler is executed on a non-main global // `DispatchQueue`. user.functions.concatenate([AnyBSON("john.smith"), AnyBSON("@companyemail.com")]) { concatenate, error in guard error == nil else { print("Function call failed: \(error!.localizedDescription)") return } guard case let .string(value) = concatenate else { print("Unexpected non-string result: \(concatenate ?? "nil")") return } print("Called function 'concatenate' and got result: \(value)") assert(value == "john.smith@companyemail.com") }
Async/Await Call a Function
Novedad en la versión 10.16.0.
The Realm Swift SDK offers async/await versions of the User.function methods.
func testAsyncCallFunction() async { let app = App(id: YOUR_APP_SERVICES_APP_ID) // ... log in ... let user = app.currentUser! do { // The dynamic member name `concatenate` is directly associated with the // function name. The first argument is the `BSONArray` of arguments to be // provided to the function - in this case, a string that represents a // username and a string that represents an email domain. let concatenatedString = try await user.functions.concatenate([AnyBSON("john.smith"), AnyBSON("@companyemail.com")]) print("Called function 'concatenate' and got result: \(concatenatedString)") assert(concatenatedString == "john.smith@companyemail.com") } catch { print("Function call failed: \(error.localizedDescription)") } }
Starting with Realm Swift SDK Versions 10.15.0 and 10.16.0, many of the Realm APIs support the Swift async/await syntax. Projects must meet these requirements:
Versión del SDK de Swift | Swift Version Requirement | Supported OS |
|---|---|---|
10.25.0 | Swift 5.6 | iOS 13.x |
10.15.0 or 10.16.0 | Swift 5.5 | iOS 15.x |
If your app accesses Realm in an async/await context, mark the code with @MainActor to avoid threading-related crashes.