2011-08-11 40 views
4

對於學習iOS編程,我正在開發用於共享圖像的iPhone應用程序。該應用程序是網站的客戶端。iPhone會檢查用戶是否在整個應用程序中登錄

在該方法中didFinishLaunchingWithOptions我檢查,如果用戶已經登錄。 如果用戶沒有登錄,他仍然可以看到應用程序的所有部分,但例如他不會看到選項按鈕編輯配置文件,對圖像的評論等。

如何在所有視圖控制器中共享記錄/不記錄狀態?

回答

5

更新:如果今天給這個建議,我會說使用一個共享的實例:

@interface SomeClass: NSObject 
{ 
    +(SomeClass *)shared; 
} 

@implementation SomeClass 
{ 
    +(SomeClass *)shared { 
     static SomeClass *shared; 
     static dispatch_once_t onceToken; 

     dispatch_once(&onceToken, ^{ 
      shared = [SomeClass new]; 
     }); 

     return shared; 
    } 
} 

然後,它是自動實例化,你在第一次使用,和可用在您的應用程序:

[[SomeClass shared] doSomething]; 

您可以使用單例 - 一個對象的全局共享實例。

@interface SomeClassSingleton : NSObject { 

} 

+(SomeClass*)sharedSomeClass; 
+(void)setSharedSomeClass:(SomeClass*)someObject; 

@end 

@implementation SomeClassSingleton 

static SomeClass* _someObject = nil; 

+(SomeClass*)sharedSomeClass 
{ 
    return _someObject; 
} 

+(void)setSharedSomeClass:(SomeClass*)someObject 
{ 
    @syncrhonized(self) 
    { 
     _someObject = someObject; 
    } 
} 

@end 

然後,當你需要訪問在另一個源文件中的對象,則導入頭文件的單身在其他的頭,就像使用其他任何引用。

創建一個單例:

SomeClass* someObject = [[SomeClass alloc] init]; 

[SomeClassSingleton setSharedSomeClass:someObject]; // write to save your singleton 

使用/讀取單:

[[SomeClass sharedSomeClass] someSharedClassMessage]; 
// OR 
SomeClass* someObject = [SomeClass sharedSomeClass]; 

或者,你可以創建一個單獨實現,自動inits你第一次訪問:

@implementation SomeClassSingleton 

static SomeClass* _someObject = nil; 

+(SomeClass*)sharedSomeClass 
{ 
    @synchronized(self) { 
     if (_someObject == nil) { 
      _someObject = [[SomeClass alloc] init]; 
     } 
    }  

    return _someObject; 
} 

@end 
+0

嘿,謝謝你的回答。爲什麼同步? –

+1

'@ syncrhonized'是爲了線程安全。在像iOS這樣的多線程環境中,您需要確保一個共享對象不會被多個線程同時修改。一個靜態的對象,或者像這裏實現的單例,在內存中只存在一個副本。 '@ synchronized'鎖定你傳遞給它的對象,從而在線程間「同步」對它的訪問,這樣任何試圖在鎖定時訪問它的線程都必須等待,直到鎖被打開。這是一個基本的「阻塞」機制,阻止第二個線程在設置鎖定時繼續執行。 – nekno

+0

謝謝你好老兄! –

1

把它放在一個像應用程序委託的單例中,或者作爲一個模型對象(如用戶數據)中的瞬態值,它可以看到任何東西。

如果您分配BOOL屬性添加到您的應用程序委託,你可以得到這樣的:

myApplicationDelegate *myDelegate = (myApplicationDelegate*)[[UIApplication sharedApplication] delegate]; 

myDelegate.userLoggedIn = YES; 
+0

我是一個新手iOS開發人員,我從來沒有使用單身或模型對象。你能給我一些提示(文章,如果你知道某人)使用它嗎?謝謝你,兄弟! –

+0

我會爲你編輯上面的答案。 –