我對iOS很新,一般在多線程環境中工作。我有一個comp sci背景,因此您可以想象,我知道沒有人實際使用信號量來管理iOS應用程序的線程,我感到沮喪。處理iOS開發中的異步化問題
我知道如何使用代表來提供回叫,我也能夠使用塊。這些工作適用於某些情況,例如請求可能不會立即可用的數據,但在看起來需要一系列依賴操作時遇到問題。
例如,我目前正在努力的問題涉及使用「Box」API。
我想:
- 有我主要的應用程序能夠撥打電話一箱管理器類,在這種情況下發送多個請求創建遠程文件夾
- 讓每個文件夾而不箱管理器創建其每次成功創建遠程目錄
的問題時回調的主類:
如果有多個請求來創建共享父目錄的文件夾,則只有一個會創建父目錄,其餘的將返回409錯誤。 API不允許你從/ home/photos/..這樣的路徑創建一個文件夾,你只需要提供一個名稱和它應該創建的父文件夾的ID。這個錯誤表明其中一個文件夾已經存在(父母)。
我可以看到解決這個問題的唯一方法是至少有第一個文件夾與給定的父母在其他人之前創建。我已經閱讀了很多其他線程,說如果你試圖讓一系列的操作同步,那麼你做錯了什麼,所以我的問題是我在哪裏想錯在這裏想這個?我應該如何思考這種情況,以便看到異步解決方案?
這裏是我使用的嘗試創建文件夾的方法:
//Folder Creation
- (void) createFolderFromPath:(NSString *)path
{
NSArray *pathWithoutRoot = [path pathComponents];
pathWithoutRoot = [pathWithoutRoot subarrayWithRange:NSMakeRange(1, [pathWithoutRoot count]-1)];
[self createFolderFromPathComponents:pathWithoutRoot withParentId:BoxAPIFolderIDRoot];
}
- (int) createFolderFromPathComponents:(NSArray *)pathComponents withParentId:(NSString *)parentId
{
if ([pathComponents count] < 1)
return EXIT_SUCCESS;
NSString *parent = pathComponents[0];
NSArray *remainder = [pathComponents subarrayWithRange:NSMakeRange(1, [pathComponents count]-1)];
BoxFoldersRequestBuilder *folderBuilder = [[BoxFoldersRequestBuilder alloc]init];
folderBuilder.name = parent;
folderBuilder.parentID = parentId;
BoxFolderBlock success = ^(BoxFolder *folder)
{
NSDictionary *folderInfo = folder.rawResponseJSON;
[self.treeInfo setObject:folderInfo[@"id"] forKey:folderInfo[@"name"]];
[self createFolderFromPathComponents:remainder withParentId:folderInfo[@"id"]];
};
BoxAPIJSONFailureBlock failure = ^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSDictionary *JSONDictionary)
{
NSLog(@"Error creating file with dictionary %@",JSONDictionary);
NSLog(@"Error creating file with error %@",error);
NSLog(@"Error creating file with response %@",response);
//Returns a 409, If I could get the ID of the folder I colided with here that would pretty much solve things,
//but Box does not send that information
};
[[BoxSDK sharedSDK].foldersManager createFolderWithRequestBuilder:folderBuilder success:success failure:failure];
return EXIT_SUCCESS;
}
同步和順序之間有區別。如果您有一系列需要按照特定順序完成的操作(例如在創建子項之前創建父文件夾),那麼就是這樣。您可以使用順序調度隊列,以便任務可以異步排隊,但是會按順序執行。您還可以分析您的任務以確定順序發生哪些需求(在文件之前創建父文件),哪些可以並行發生(創建文件)並將任務提交到相應類型的隊列 – Paulw11
如果必須編寫代碼我每天寫信號量,鎖等,我會完全發瘋。 – gnasher729