簡體   English   中英

如何讓UIProgressView顯示從文件(iPhone)加載NSArray的進度?

[英]How to make UIProgressView to show progress of NSArray loading from file (iPhone)?

我希望它甚至可能。

我有應用程序啟動后加載真正大文件(字典)的代碼:

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    NSString *filePath = [NSString stringWithContentsOfFile:[[NSBundle mainBundle]
        pathForResource:@"en_US" ofType:@"txt"]
        encoding:NSUTF8StringEncoding error:nil];
    dictionary = [NSSet setWithArray:[NSArray arrayWithArray:
        [filePath componentsSeparatedByCharactersInSet:
        [NSCharacterSet whitespaceAndNewlineCharacterSet]]]];
}

另外我在viewDidLoad有正確的代碼:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.progressView.progress = 0.0;
    [self performSelectorOnMainThread:
        @selector(applicationDidFinishLaunching:)
        withObject:nil
        waitUntilDone:NO];
}

但我不知道如何強制UIProgressView顯示從NSArray創建NSSet dictionary進度。 在iOS模擬器中需要幾秒鍾,因此在設備上它可能需要十幾個。 我真的需要顯示進度,我更喜歡這種方式而不是活動指標視圖。

我現在對如何計算進口商品感興趣(已知所有商品的數量)。

任何想法? :)

使用SVProgressHUD 它有showProgress等代表來顯示進度。

編輯:

請注意,這只是對方法的建議而非實際實施。 根據您的觀察,您可能會或可能不會選擇實施它。

如果它是本地文件,您可以對讀取整個文件所需的總時間進行一些計算猜測。 然后將此時間除以100。

創建一個異步隊列,使用arrayWithContentsOfFiledictionaryWithContentsOfFile或其他方法從文件中讀取。 在主線程上實現一個計時器,並通過它遞增1,並在主線程上保持發布進度(不要從異步線程中讀取進度,因為它永遠不會告訴你,我們正在偽造它)。

一旦arrayWithContentsOfFile返回,在主線程上發布100%。 您可能需要調整一點才能准確(例如在Windows中您不斷看到文件下載時間波動)但我認為變化不會太大。 每種類型的目標設備都會給出硬件和內存,因此它只是文件大小的函數。

如果要解析長文本文件,框架類將花費很長時間。 你不能改變它。 而你無法改變他們在工作期間永遠不會回電話來告訴你他們的進步。

您唯一的機會是自己執行文本文件拆分,並在瀏覽文本文件時設置進度。 您可以使用正則表達式拆分文本文件。 “\\ w +”收集至少包含一個字符的單詞。

如果您在繁重的工作方法中設置進度條,則必須花一些時間來偶爾刷新屏幕。 請參閱下面的“futuredate magic”。

也許以下內容可以作為起點 - 在下面的代碼中,文本文件的內容存儲在NSString“內容”中。

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression
                              regularExpressionWithPattern:@"\\w+"
                              options:NSRegularExpressionCaseInsensitive
                              error:&error];

[regex enumerateMatchesInString:content
                        options:0
                          range:NSMakeRange(0, [content length])
                     usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
                         // push one match to the dictionary
                         [dictionary addObject:[content substringWithRange:match.range]];

                         // update the progress bar
                         NSDate* futureDate = [NSDate dateWithTimeInterval:0.001 sinceDate:[NSDate date]];
                         [[NSRunLoop currentRunLoop] runUntilDate:futureDate];
                         self.progressbar.progress = (float) match.range.location/content.length;
}];

請注意,代碼未針對速度進行優化。 例如,您不應該使用每個令牌更新進度條。 根據您擁有的令牌數量 - 計算檢測到的令牌並每100次匹配更新pgogress欄,或者等等......

您需要使用NSURLRequest / NSURLConnection來啟動異步請求以獲取字典數據。 NSURLConnection的代理將為您提供讀取的字節數和剩余字節數,您可以在其中執行異步調度到主線程以更新進度視圖值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM