Reading a property on a main thread that is set on a background thread I am currently handling some setup of an object on a background thread (I am using a concurrent queue within the following initWithDocumentFileURL method):

+ (TWReaderDocument *)initWithDocumentFileURL:(NSURL *)url withLoadingCompletionBlock:(loadingCompletionBlock)completionBlock{

 __block NSError *error;
TWReaderDocument * twDoc = [[TWReaderDocument alloc] init];
twDoc.status = ReaderDocCreated;
twDoc.doc = [ReaderDocument withDocumentFilePath:[url path] withURL:url withLoadingCompletionBLock:^(NSError *_error) {

    if (_error)
    {
        _error = error;
        twDoc.status = ReaderDocReady;
    }
    else twDoc.status = ReaderDocFailed;

}];

//completionBlock(error);

return twDoc;
}


Header

@property (nonatomic, assign, readonly) TWReaderDocumentStatus status;


Implementation

- (TWReaderDocumentStatus) status {

    __block TWReaderDocumentStatus readStatus;

    dispatch_sync([ReaderDocument concurrentLoadingQueue], ^{
        readStatus = _status;
    });

    return readStatus;

}


If I would like to access the status property on the main thread do I need to take any precaution or there is nothing to take care of as I am just reading the property on the main thread?
If all you're trying to synchronize is TWReaderDocumentStatus, and if that's a simple data type (e.g. an integer or float, not an object), you can just define it as atomic, and it can be safely read and updated from multiple threads, with no custom getter required. This is one of the very few situations where atomic can be useful for synchronization (and it's remarkably efficient).

By the way, if your property has a public interface that is readonly, make sure the private class extension redefines it as readwrite so the setter is synthesized for you. And make sure that you only set it using the setter (not bypassing it and using the instance variable directly).