Platformsios 7.0, requires ARC
DependenciesRealm, RealmUtilities

This project is deprecated as of Realm 2.2 due to native support for passing objects across threads.

Realm released "Thread-safe references" which conceptually act the same as RBQSafeRealmObject but support all types, including objects without primary keys, Realms, results, and lists:

  1. Initialize a ThreadSafeReference with the thread-confined object.
  2. Pass that ThreadSafeReference to a destination thread or queue.
  3. Resolve this reference on the target Realm by calling Realm.resolve(_:). Use the returned object as you normally would.

For example:

let realm = try! Realm()
let person = Person(name: "Jane") // no primary key required
try! realm.write {
let personRef = ThreadSafeReference(to: person)
DispatchQueue(label: "").async {
  let realm = try! Realm()
  guard let person = realm.resolve(personRef) else {
    return // person was deleted
  try! realm.write { = "Jane Doe"

See the release blog post for more details.

Thread-Safe Representation Of A Realm Object

Language Objective-C | Swift 3

This class allows you to create a thread-safe representation of a given RLMObject subclass. For example, this enables performing queries on a background thread, and passing results as RBQSafeRealmObject to the main-thread for display.

Note: It will only work with an RLMObject that has a primary key.

Both an Objective-C and Swift version are availble. Swift 2.0 support added in version 0.4.

How To Use


dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    RLMObjectSubclass *anObject = [RLMObjectSubclass objectForPrimaryKey:@"key"];

    RBQSafeRealmObject *safeObject = [RBQSafeRealmObject safeObjectFromObject:anObject];

    dispatch_async(dispatch_get_main_queue(), ^{
        RLMObjectSubclass *mainThreadObject = [safeObject RLMObject];

        // Do Something...

Swift 3 {
    let anObject = Object()

    let safeObject = SafeObject(object: anObject)

    DispatchQueue.main.async {
        let mainThreadObject = safeObject.object()


RBQSafeRealmObject is available through CocoaPods. To install
it, simply add the following line to your Podfile:


pod "RBQSafeRealmObject"


pod "SafeRealmObject"

CocoaPod Linting

Linting using CocoaPods 1.1.0.rc.2 (with Xcode 8 fixes) needs FORK_XCODE_WRITING to be set to get the build to work. One warning comes through from Realm core.

FORK_XCODE_WRITING=true pod lib lint SafeRealmObject.podspec --allow-warnings

Latest podspec

    "name": "RBQSafeRealmObject",
    "version": "1.1",
    "summary": "Thread-safe representation of a Realm object",
    "description": "RBQSafeRealmObject represents a RLMObject with a primary key and can be used across threads.",
    "homepage": "",
    "license": {
        "type": "MIT",
        "file": "LICENSE"
    "authors": {
        "Roobiq": "[email protected]"
    "social_media_url": "",
    "platforms": {
        "ios": "7.0"
    "source": {
        "git": "",
        "tag": "v1.1"
    "source_files": "*.{h,m}",
    "requires_arc": true,
    "dependencies": {
        "Realm": [
            ">= 0.99.1"
        "RealmUtilities": [

Pin It on Pinterest

Share This