mazllia / Social-Networking-Notes

NCTU CS Project (2012 Fall-2013 Spring)
0 stars 0 forks source link

ServerCommunicator Public APIs #8

Open mazllia opened 10 years ago

mazllia commented 10 years ago
typedef enum {
    ServerActionPush,
    ServerActionPull
} ServerAction
/**
 @class ServerCommunicator
 To sync with server. Handles *NSManagedObject*s and returns *NSDictionary* and *NSArray* parsed from server's JSON.
*/

@property (weak, nonatomic) id<ServerCommunicatorDelegate> delegate;

/**
 Let delegate to handle sync status.
 */
@protocol ServerCommunicatorDelegate <NSObject>
@required
/**
 @param syncedNoteDictionaries Dictionaries with constant @e ServerNote* key and its value pairs
 */
- (void)serverCommunicatorNotesSynced:(NSArray *)syncedNoteDictionaries fromAction:(ServerAction)action;
/**
 @param syncedContactDictionaries Dictionaries with constant @e ServerContact* key and its value pairs
 */
- (void)serverCommunicatorContactSynced:(NSArray *)syncedContactDictionaries fromAction:(ServerAction)action;
@end

- (instancetype)initWithDelegate:(id<ServerCommunicatorDelegate>)delegate;

/**
 當使用者第一次使用app時,使用這api跟server索取ContactUID (假如使用的facebookUID 已經存在,則回傳該 facebookUID 綁定的ContactUID。
 @return ContactUID
 */
- (NSString *)registerUserAccount;

/**
 Tell the server user's all friends and get our users, which is a subset of user's all friends. Evoking @e serverCommunicatorContactSynced method.
 @param fbFriends Array of Facebook uid @e NSString
 @return NO if server is unavailable
 */
- (BOOL)getAvailableUsersFromFBFriends:(NSArray *)fbFriends;

/**
 Accept un-synced @e NSManagedObject classes, including creation and modification, and upload it to our server. Evoking @e serverCommunicatorNotesSynced and @e serverCommunicatorContactsSynced method.
 @return NO if server is unavailable
 */
- (BOOL)pushNotes:(NSArray *)notes contacts:(NSArray *)contacts;

/**
 Get all notes, from the purpose of user's devices sync and user friend's note sending. Evoking @e serverCommunicatorNotesSynced method.
 @return NO if server is unavailable
 */
- (BOOL)getLastestNotes;

New properties inside the .m file:

@property (strong, nonatomic) Contact *user;
@property (strong, nonatomic) NSString *deviceUID;
JASPER012 commented 10 years ago

我又想起來1個舊的問題

1.local 端新增的note 準備上傳給server時,noteUID = 啥?(之前我開玩笑說是-1...)

JASPER012 commented 10 years ago

2.下載檔案時的儲存位置,我要如何得知。(這時候我手上並沒有Multimedia 的物件)

JASPER012 commented 10 years ago

3.假如note 發送給3個人,要如何判定此note 是否已被接收、已讀。(1個人以上接收就判定已接收嗎?)

mazllia commented 10 years ago

@JASPER012: 昨天在你那邊編輯的資料最後沒有按update,最後資料還是沒有更新上去… 你還記得漏了什麼嗎? API: -(NSString *)registerUseraccount:(NSString *)facebookUID;,facebookUID可以由property拿到,不需額外參數傳遞

mazllia commented 10 years ago
  1. nil 好了,等上傳成功,同步的 class 再去 assign
  2. 下載檔案有兩種case。但檔案都下載到 sandbox 中的同一個資料夾,delegate 會在新增 Multimedia 物件的時候處理好它的 property。你可以用 Multimedia localURL 的 code (下面我有附)來決定儲存位置。
    1. 若 Note 還未被建立getLastestNotes:,甚至拿不到 note 物件
    2. 若 Note 已被建立並可取得 pushNotes: contact:,從 note.media 可以拿到物件
  3. 全部都已讀才叫已讀好了 這點我們之後在新增功能時可以再改善 ><
- (NSString *)localURL
{
        NSError *err;
        NSString *documentURL = [[[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:&err] absoluteString];
        if (err) {
                [[NSException exceptionWithName:@"Multimedia(Create) localURL Directory" reason:[err localizedDescription] userInfo:nil] raise];
        }
        return [documentURL stringByAppendingPathComponent:self.fileName];
}
JASPER012 commented 10 years ago

4.我覺得需要新增1個delegate api 來負責處理上傳檔案的結果。

當我上傳所有檔案結束,會呼叫這個 delegate 並傳一個 array給這個api 。

此array 每個element 的內容為上傳失敗的filename ,假如全部檔案上傳成功則array 是空的。

mazllia commented 10 years ago

4.我覺得這個功能應該是由 - (void)serverCommunicatorNotesSynced:(NSArray *)syncedNoteDictionaries; 擴充完成。透過 "ServerMultimediaSync": true/false 這個新定義的 constant 存在 syncedNoteDictionaries 中來指示 ServerCommunicator 下載檔案的成功與失敗。

mazllia commented 10 years ago

5.我在實作 ServerSynchronizer 的時候已經把 ServerCommunicator 的呼叫都放在副執行緒了,所以如果你不熟悉 concurrency programming,那就放心交給我吧!

發現問題:"After pulling, local.data.sync==NO means local data is newer than server, server's data will be ignored",所以我需要在 delegate methods 中新增 parameter fromAction:(ServerAction)action 以及一個 enum:

typedef enum {
ServerActionPush,
ServerActionPull
} ServerAction
JASPER012 commented 10 years ago

第4點的解決方式是,假如我上傳n個note。

最後這n個note 的資訊也要出現在syncedNoteDictionaries 中來指示嗎?

所以說最後syncedNoteDictionaries 包括了 1.我自己push的note 2.別人寄給我 3.別台機器同步更動的note

mazllia commented 10 years ago

4.是的

mazllia commented 10 years ago

提議:改名 ServerMediaFileListServerNoteMediaFileList

因為它不是 Multimedia 的一個 attribute,而是 Note JSON 的一個陣列名稱

#define ServerMediaFileList @"file_list"
mazllia commented 10 years ago

#define ServerNoteUserUID @"user_uid"

這個似乎沒有用到,刪掉?