如何减慢ios进程

时间:2014-09-02 13:53:53

标签: ios multithreading performance process

我有一个可以向服务器发送信息的应用。这些信息在白天堆积起来(当客户使用应用程序时),当他如此渴望时,他可以点击更新"按钮发送服务器上的所有内容。

这一直很好,直到他最近有一个流量增加,从更新10个对象到超过100个。

显然,更新需要更多时间,而不是问题。

问题是,在某些时候,我正在

Error: Error Domain=NSURLErrorDomain Code=-1001 "La requête a expiré." 
UserInfo=0x189874b0 {NSErrorFailingURLStringKey=http://www.*********.be/upload,
NSErrorFailingURLKey=http://www.************.be/upload, 
NSLocalizedDescription=La requête a expiré., 
NSUnderlyingError=0x189abd70 "La requête a expiré."}

对于法国恐惧症,"请求已过期"正如你所注意到的那样,我回来了,并且我用****隐藏了网址。

现在,我已经尝试过本地,它可以正常使用小更新,但是当我在我的更新上循环150次(我发送150次相同的东西)时,在某些时候我只是得到上面的错误X倍。所有最后一项都不会出现此错误,中间可以是20,或者30等等。

有没有办法可以改变它?

以下是一段必须与问题相关的代码。

// Set the max number of concurrent operations (threads)
    //[operationQueue setMaxConcurrentOperationCount:3]; // Todo: try increasing max thread count
    [operationQueue setMaxConcurrentOperationCount:NSOperationQueueDefaultMaxConcurrentOperationCount]; //dynamic thread count
    self.queueCount = persons.count;
    self.currentQueue = 1;

    for (Person *person in persons) {
        for (int i = 0 ; i<130 ; i++){  //this is where i try to break the app
        [self createSendPersonOperation:person];
        }}

现在可能有用的是将最后一行放在&#34;&#34;&#34;每20次左右就会减慢这个过程,所以服务器或应用程序都不会发疯。

这可能吗?如果是这样,怎么样?

注意:我是一名初级开发人员,试图进入高级代码,但这个人不可用,所以我可以获得所有帮助。

编辑:另外,您是否认为我的错误来自服务器端问题,或者肯定是应用程序方面的问题?

编辑:完成HTTP请求。 因此,对于保存到应用程序中的每个人,当用户决定更新时,它会对人员阵列中的每个人执行此操作。

- (void)createSendPersonOperation:(Person *)person
{
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", @"application/json", nil];

    NSDictionary *params = @{
        @"email": person.email,
        @"gender": person.gender,
        @"language": person.language,
        @"hasFacebook": person.hasFacebook,
        @"sendPostalCard": person.sendPostalCard
    };

    NSLog(@"params: %@", params);

    [manager POST:kURLUpdate parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        // Add picture to the form
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];

        NSString *pictureFilePath = [documentsDirectory stringByAppendingPathComponent:person.picture];
        NSURL *pictureURL = [NSURL fileURLWithPath:pictureFilePath];

        [formData appendPartWithFileURL:pictureURL name:@"picture" error:nil];
    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"Success: %@", responseObject);

        if ([responseObject isKindOfClass:[NSDictionary class]]) {
            if ([responseObject objectForKey:@"error"]) {
                NSLog(@"Error 1");
                NSDictionary *error = [responseObject objectForKey:@"error"];
                NSLog(@"Error message: %@", [error objectForKey:@"message"]);
            } else {
                // Set Person's sended attribute
                person.sended = @YES;

                [Person saveObject:[[PersistentStack sharedInstance] managedObjectContext] error:nil];
            }
        } else {
            NSLog(@"Error 2");
        }

        [self decreaseQueueCount];
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
        NSLog(@"Parameter that failed : %@", [params objectForKey:@"email"]);
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Erreur"
                                                            message:[error localizedDescription]
                                                           delegate:nil
                                                  cancelButtonTitle:@"Fermer"
                                                  otherButtonTitles:nil];
        [alertView show];

        self.updateHud.mode = MBProgressHUDModeText;
        self.updateHud.labelText = AMLocalizedString(@"update.failure.message", @"");

        [self.updateHud hide:YES afterDelay:3];
    }];
}

1 个答案:

答案 0 :(得分:0)

我真的不知道你问题的来源,但如果你觉得放慢应用程序至少可以帮助你理解你的问题,你可以用这样的东西来做:

NSDate *loopUntil = [NSDate dateWithTimeIntervalSinceNow:15];
while ([loopUntil timeIntervalSinceNow] > 0) {
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
                             beforeDate:loopUntil];
}

它会在继续之前等待15秒,所以你可以按照你的建议在20~30次请求之后把它放进去。

我真的相信你应该考虑将你的请求或类似的东西分组,这样你就不会超载你的服务器(如果这确实是你的问题)。